ฟีเจอร์
การใช้ร่วมกันระหว่างบัญชี
หน้านี้แปลด้วยเครื่องจากภาษาอังกฤษ ยินดีรับการแก้ไข แก้ไขหน้านี้บน 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>/: สำเนาที่ใช้ร่วมกัน
internal/cli/share.goอ่านการตั้งค่า นำค่าของแต่ละ--<item>ไปใช้กับสำเนาของการตั้งค่าบัญชีด้วยconfig.Share.Setและปฏิเสธหากบัญชีกำลังทำงานshare.Buildเปรียบเทียบการตั้งค่าปัจจุบันกับเป้าหมายแล้วระบุขั้นตอน โดยอ่านดิสก์อย่างเดียว:os.Lstatและos.Readlinkสำหรับทุกพาธในshare.Layoutแผนคือรายการของการดำเนินการ ได้แก่ ย้ายเข้าไปในตำแหน่งที่ว่างของกลุ่ม (adopt) ย้ายไฟล์ที่กลุ่มยังไม่มี (merge dir) เขียนความขัดแย้งที่ตัดสินแล้วลงในกลุ่ม สำรอง ยกเลิกลิงก์ ลิงก์ คัดลอกกลับ เขียนพาธปลั๊กอินใหม่ และรวมรีจิสทรีปลั๊กอิน- ความขัดแย้งจะถูกตัดสินผ่านพรอมต์หรือด้วย
--prefer Plan.Describeพิมพ์แผน แล้ว ccam จะถาม- การตั้งค่าเป้าหมายจะถูกเขียนลงใน
config.tomlก่อนที่จะย้ายสิ่งใด หากPlan.Applyหยุดกลางคันccam doctor --fixและการรันซ้ำจะสร้างแผนไปสู่เป้าหมายที่บันทึกไว้และทำการเปลี่ยนแปลงให้เสร็จ 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 againccam 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 จะเตือนและถามก่อนทำงานต่อ