ฟีเจอร์
การคัดลอกการตั้งค่าที่มีอยู่
หน้านี้แปลด้วยเครื่องจากภาษาอังกฤษ ยินดีรับการแก้ไข แก้ไขหน้านี้บน GitHub
หากคุณเคยใช้ Claude Code ก่อนใช้ ccam การตั้งค่าของคุณจะอยู่ใน ~/.claude และ ~/.claude.json คำสั่ง ccam migrate จะคัดลอกการตั้งค่าเหล่านั้นไปยังกลุ่มที่ใช้ร่วมกัน เพื่อให้ทุกบัญชีที่ใช้รายการเหล่านั้นร่วมกันผ่านกลุ่มได้เริ่มต้นด้วยการตั้งค่าที่คุณมีอยู่แล้ว โฟลเดอร์ต้นทางจะถูกอ่านอย่างเดียว และ claude แบบปกติยังทำงานได้เหมือนเดิม ให้รันหนึ่งครั้งหลัง ccam add ครั้งแรก และรันอีกครั้งทุกครั้งที่มีบัญชีเริ่มใช้เซิร์ฟเวอร์ MCP ร่วมกัน
การใช้งาน
ccam migrate # ~/.claude into group default, checklist on a terminal
ccam --dry-run migrate # show the plan, copy nothing
ccam migrate --settings --mcp # only these items, no checklist
ccam migrate --history --yes # conversation history only, no questions
ccam migrate ~/.claude-work --group workบนเทอร์มินัล หากไม่ระบุแฟล็กของรายการและไม่ใส่ --yes ccam จะแสดงรายการตรวจสอบ (checklist) ก่อน:
Copy into group default
From /home/me/.claude
? Choose what to copy (Space to toggle)
› [x] MCP servers
[x] settings.json
[x] global CLAUDE.md
[x] agents, commands, skills
[ ] conversation history
Enter show the plan · Esc cancelSpace (หรือ x) สลับรายการที่เคอร์เซอร์อยู่ ปุ่มลูกศรหรือ j/k ใช้เลื่อน Enter แสดงแผน ส่วน Esc, q หรือ Ctrl+C จะพิมพ์ Cancelled. รายการที่ต้นทางไม่มีข้อมูลจะมีเครื่องหมาย not found หากคุณยกเลิกการเลือกทั้งหมด ccam จะพิมพ์ Nothing selected. และหยุด
จากนั้น ccam จะพิมพ์แผนและถามก่อนคัดลอก:
$ ccam migrate --yes
Copy from /home/me/.claude into group default (/home/me/.local/share/ccam/groups/default):
mcp ~/.claude.json new: fs, linear
sign-ins linear → personal; skipped: work (not logged in yet)
settings settings.json new: 61 B
memory CLAUDE.md new: 11 B
extensions agents/ add 1 file the group lacks (6 B)
skills/ add 1 file the group lacks (13 B)
not found, skipped: commands/, plugins/, output-styles/, rules/
Conversation history (projects/, history.jsonl) is not included; add --history to copy it.
✓ Copied into group default: 2 MCP servers, settings.json, CLAUDE.md, agents/, skills/, MCP sign-ins for personal
MCP sign-ins were not copied to: work (not logged in yet). Sign in to those servers there with /mcp.
Accounts that share these through group default:
mcp personal, work
settings personal, work
memory personal, work
extensions personal, workกลุ่มจะไปถึงเฉพาะบัญชีที่ใช้รายการร่วมกันผ่านกลุ่มนั้น สรุปผลจึงแสดงรายชื่อบัญชีแยกตามรายการ สำหรับบัญชีที่ยังไม่ได้ใช้ร่วมกัน ccam จะพิมพ์คำสั่ง ccam share <name> --<item> on สำหรับเปิดการใช้ร่วมกัน
ตัวเลือก
| ตัวเลือก | สิ่งที่ทำ | ค่าเริ่มต้น |
|---|---|---|
[folder] |
โฟลเดอร์ Claude Code ที่จะคัดลอกจาก | ~/.claude |
--settings |
คัดลอก settings.json |
ปิด |
--memory |
คัดลอก CLAUDE.md ระดับ global |
ปิด |
--extensions |
คัดลอก agents/, commands/, skills/, plugins/, output-styles/, rules/ |
ปิด |
--mcp |
คัดลอกเซิร์ฟเวอร์ MCP ของผู้ใช้ (mcpServers ใน .claude.json) |
ปิด |
--history |
คัดลอกประวัติการสนทนา (projects/, history.jsonl) |
ปิด |
-g, --group string |
กลุ่มที่จะคัดลอกไป | default |
-y, --yes |
คัดลอกโดยไม่ถาม เมื่อขัดแย้งกันจะเก็บสำเนาของกลุ่มไว้ | ปิด |
--dry-run (global) |
พิมพ์แผนแล้วหยุดก่อนถามหรือคัดลอกใด ๆ | ปิด |
หากไม่ระบุแฟล็กของรายการ บนเทอร์มินัลรายการตรวจสอบจะเป็นตัวกำหนด นอกเทอร์มินัล หรือเมื่อใส่ --yes ccam จะคัดลอกทุกอย่างยกเว้นประวัติการสนทนา ประวัติไม่ถูกรวมไว้โดยค่าเริ่มต้นเพราะ projects/ อาจมีขนาดใหญ่
--group on หมายถึง default ส่วน --group off และ --group local จะถูกปฏิเสธด้วย --group takes a group name, not "off" ccam migrate รองรับ --dry-run และรายการตรวจสอบยังคงแสดงในการทดลองรัน คุณจึงดูตัวอย่างสิ่งที่เลือกได้
วิธีการทำงาน
internal/cli/migrate.go เลือกรายการ จากนั้น migrate.Build อ่านต้นทางและกลุ่มแล้วคืนแผนกลับมา ไม่มีสิ่งใดถูกเขียนจนกว่าจะถึง Plan.Apply หลังจากที่คุณยืนยัน
- หาต้นทาง
checkSourceจะปฏิเสธพาธที่ไม่มีอยู่ ไม่ใช่โฟลเดอร์ หรือไม่มีรายการของ Claude Code ที่รู้จักเลยmigrate.ClaudeJSONหา.claude.jsonที่เป็นของโฟลเดอร์นั้น: อยู่ภายในโฟลเดอร์ หรือสำหรับ~/.claudeที่ไม่มีไฟล์นี้อยู่ภายใน คือ~/.claude.jsonที่อยู่ข้าง ๆ ซึ่งเป็นตำแหน่งที่ Claude Code เก็บไฟล์นี้เมื่อไม่ได้ตั้งCLAUDE_CONFIG_DIR - จับคู่รายการกับพาธ ทุกพาธมาจาก
share.Layoutซึ่งเป็นรายการที่อนุญาตชุดเดียวกับที่ccam shareใช้ เซิร์ฟเวอร์ MCP ถูกอ่านออกจาก.claude.jsonด้วยmcp.LocalServersซึ่งใช้ตัวสแกนprofile.TopLevelValueแทนการพาร์สทั้งไฟล์ - คัดลอก ไม่ย้าย ไฟล์จะไปที่
~/.local/share/ccam/groups/<group>/ด้วยfsutil.AtomicWriteหรือfsutil.CopyFileส่วนเซิร์ฟเวอร์ MCP จะไปอยู่ในmcp.jsonของกลุ่ม
แต่ละรายการจับคู่พาธต้นทางหนึ่งพาธกับพาธของกลุ่มหนึ่งพาธ:
สองแถวของประวัติเป็นเส้นประ เพราะจะถูกคัดลอกเฉพาะเมื่อใส่ --history .credentials.json และ .claude.json อยู่ใน share.Never และไม่มีวันไปถึงกลุ่ม: Build จะคืนข้อผิดพลาดภายในหากไฟล์ใดไฟล์หนึ่งปรากฏในโครงสร้าง และการไล่ดูโฟลเดอร์จะข้ามไฟล์เหล่านี้ตามชื่อ
buildEntry กำหนดสถานะให้ทุกพาธ ซึ่งคือสิ่งที่แต่ละบรรทัดของแผนอธิบาย:
- Missing: ไม่มีในต้นทาง หรือเป็นไฟล์ในตำแหน่งที่ควรเป็นโฟลเดอร์ แสดงหนึ่งครั้งต่อรายการเป็น
not found, skipped - Linked: พาธต้นทางชี้ไปยังสำเนาของกลุ่มอยู่แล้ว เช่น เมื่อต้นทางเป็นโฟลเดอร์โปรไฟล์ของ ccam
- Same: กลุ่มมีเนื้อหาที่เหมือนกันอยู่แล้ว
- New: กลุ่มยังไม่มี จึงคัดลอกทั้งหมด
- Merge: เป็นโฟลเดอร์ทั้งสองฝั่ง
copyMissingเพิ่มเฉพาะไฟล์ที่กลุ่มยังไม่มี ไฟล์ที่ต่างกันจะคงไว้ตามที่กลุ่มมี และแผนจะแสดงgroup copies keptสำหรับplugins/รีจิสทรีinstalled_plugins.jsonและknown_marketplaces.jsonจะถูกรวมเข้าด้วยกัน และพาธปลั๊กอินแบบสัมบูรณ์จะถูกเขียนใหม่ให้ชี้ไปที่โฟลเดอร์ของกลุ่ม - Conflict: เป็นไฟล์ทั้งสองฝั่งแต่เนื้อหาต่างกัน คุณเลือกทีละไฟล์:
keep group,use mineรวมถึงmerge JSONสำหรับไฟล์.json(การรวมแบบลึกที่ค่าของกลุ่มมีผลเหนือกว่าเมื่อค่าขัดกัน) หรือmerge by lineสำหรับhistory.jsonlเซิร์ฟเวอร์ MCP ที่นิยามต่างกันก็ถือเป็นความขัดแย้งเช่นกัน โดยเลือกได้keep groupหรือuse mineตัวเลือกแรกในรายการคือค่าเริ่มต้นเมื่อคุณกด Enter ส่วน--yesจะเก็บสำเนาของกลุ่มไว้เสมอ
รายการตรวจสอบเองคือ tui.MigratePicker ซึ่งสร้างบนคอมโพเนนต์ checklist ที่ ccam add ใช้ migrate.Found ทำเครื่องหมายรายการที่ไม่มีด้วยการเรียก lstat และรายการเซิร์ฟเวอร์ MCP
การลงชื่อเข้าใช้ MCP
เซิร์ฟเวอร์ MCP ที่ลงชื่อเข้าใช้ด้วย OAuth เก็บโทเค็นไว้ในไฟล์เข้าสู่ระบบ .credentials.json ภายใต้ mcpOAuth ไม่ได้อยู่ในรายการเซิร์ฟเวอร์ Claude Code ใช้คีย์ของแต่ละรายการเป็น <name>| ตามด้วย 16 อักขระแรกของแฮช sha256 ของ type, url และ headers ของเซิร์ฟเวอร์ คีย์นี้ไม่ขึ้นกับโฟลเดอร์ รายการที่คัดลอกจึงใช้ได้ในบัญชีอื่นตราบใดที่นิยามเซิร์ฟเวอร์เหมือนกันทุกประการ ดังนั้น buildLogins ใน internal/migrate/logins.go จึงคัดลอกเฉพาะรายการของเซิร์ฟเวอร์ที่กลุ่มจะได้รับตามนิยามของต้นทาง ได้แก่ เซิร์ฟเวอร์ใหม่ เซิร์ฟเวอร์ที่เหมือนกันอยู่แล้ว หรือความขัดแย้งที่คุณเลือก use mine การลงชื่อเข้าใช้ของเซิร์ฟเวอร์ปลั๊กอิน (คีย์ที่ขึ้นต้นด้วย plugin:) จะถูกคัดลอกไปด้วยเมื่อคุณคัดลอกส่วนขยายและต้นทางมี plugins/
รายการเหล่านี้จะไปอยู่ใน .credentials.json ของแต่ละบัญชีที่ได้รับ ซึ่งเขียนด้วย fsutil.AtomicWrite ในโหมด 0600 และไม่มีวันไปอยู่ในกลุ่ม บัญชีจะได้รับก็ต่อเมื่อใช้ mcp ร่วมกัน (หรือ extensions สำหรับเซิร์ฟเวอร์ปลั๊กอิน) ผ่านกลุ่มเป้าหมาย และจะเพิ่มเฉพาะคีย์ที่บัญชียังไม่มี: รายการที่บัญชีมีอยู่แล้ว ซึ่งอาจใหม่กว่า จะถูกเก็บไว้ บรรทัด sign-ins ในแผนแสดงเซิร์ฟเวอร์ บัญชีที่ได้รับ และบัญชีที่ถูกข้าม ccam จะข้ามบัญชีและระบุชื่อพร้อมเหตุผล เมื่อบัญชีนั้น:
- ลงทะเบียนไว้ในตำแหน่งเดิมด้วย
ccam importเพราะclaudeแบบปกติอาจกำลังใช้ไฟล์เข้าสู่ระบบของบัญชีนั้นอยู่ - กำลังทำงาน เพราะ Claude Code เขียนไฟล์เข้าสู่ระบบใหม่ (ตรวจซ้ำอีกครั้งก่อนเขียน และรายงานเป็น
started meanwhile) - ยังไม่ได้เข้าสู่ระบบ
- เก็บการเข้าสู่ระบบไว้ในพวงกุญแจ (Keychain) ของ macOS ซึ่ง ccam ไม่เขียน
ให้ลงชื่อเข้าใช้เซิร์ฟเวอร์ในบัญชีที่ถูกข้ามด้วย /mcp บัญชีที่เริ่มใช้เซิร์ฟเวอร์ MCP ร่วมกันภายหลังจะได้รับการลงชื่อเข้าใช้เมื่อคุณรัน ccam migrate อีกครั้ง โดยสรุปผลจะแจ้งด้วย Then run `ccam migrate` again to give them the MCP sign-ins too.
ความปลอดภัยและกรณีพิเศษ
- ต้นทางจะถูกอ่านอย่างเดียว ไม่มีไฟล์ใดในต้นทางถูกย้าย ลิงก์ หรือเปลี่ยนแปลง และการเข้าสู่ระบบของต้นทางจะไม่ถูกเขียนเลย รวมถึงบน macOS ที่อาจอ่านจากพวงกุญแจ (Keychain)
- ก่อนที่ไฟล์ของกลุ่มจะถูกแทนที่ ไม่ว่าจะด้วย
use mineการรวม หรือเซิร์ฟเวอร์ MCP ใหม่ในmcp.jsonที่มีอยู่ สำเนาของกลุ่มจะถูกบันทึกไว้ใน<group>/.ccam-backup/<time>/ชื่อโฟลเดอร์ไม่ซ้ำกันในแต่ละครั้งที่รัน การรันสองครั้งในวินาทีเดียวกันจึงไม่เขียนทับสำรองของกันและกัน สรุปผลจะพิมพ์พาธนั้น - เมื่อใช้
--yesทุกความขัดแย้งจะเก็บสำเนาของกลุ่มไว้ และ ccam จะบอกวิธีเลือกเอง: รันคำสั่งเดิมโดยไม่ใส่--yes - หากไม่มีสิ่งใดเปลี่ยน ccam จะพิมพ์
Nothing to copy.และหากทุกความขัดแย้งเก็บสำเนาของกลุ่มไว้ จะพิมพ์Nothing to copy: the group keeps its own copies. - หากการคัดลอกล้มเหลวกลางคัน ccam จะหยุดด้วย
The source folder was not changed. Group files replaced so far are saved inตามด้วยโฟลเดอร์สำรอง - ต้นทางที่ไม่มีอยู่จะจบด้วย
no Claude Code folder at <path>. Give the folder to copy from: ccam migrate <folder>