ซิงก์การตั้งค่า Claude Code (CLAUDE.md, skills, ปลั๊กอิน, MCP) ระหว่างหลายเครื่องด้วย cclayer และแยกตัวตน git ตามทีม
พอใช้ Claude Code ไปนาน ๆ ใน ~/.claude จะมีของสะสมเยอะขึ้นเรื่อย ๆ ทั้ง CLAUDE.md ระดับ global, rules ต่าง ๆ, skills, hooks, สิทธิ์และปลั๊กอินใน settings.json แล้วก็ MCP server อีกเป็นกอง ผมใช้ Claude Code บนหลายเครื่อง ทุกเครื่องต้องตั้งค่าใหม่หมด พอแก้กฎนิดหน่อยในเครื่องหนึ่ง เครื่องอื่นก็ต้องตามไปแก้เองด้วยมือ นานเข้าการตั้งค่าแต่ละเครื่องก็ไม่ตรงกันอีกต่อไป
ที่ยุ่งกว่านั้นคือโปรเจกต์มาจากหลายทีม แต่ละทีมใช้ตัวตนในการ commit git (ชื่อผู้ใช้ อีเมล) ไม่เหมือนกัน บางทีมยังมี rules และ hook ของตัวเองด้วย ของพวกนี้ควรมีผลเฉพาะในโปรเจกต์ของทีมนั้น ห้ามปนไปโปรเจกต์อื่น และยิ่งห้ามเอาอีเมลบริษัทไป commit ลง repository โอเพนซอร์สของตัวเอง
จะโยน ~/.claude ทั้งก้อนเข้า git repository ก็ไม่ได้ เพราะข้างในมีสถานะการล็อกอิน ประวัติเซสชัน การตั้งค่าสิทธิ์ของเครื่องนั้น ๆ ส่วนของของทีมก็เอาไปใส่ repository สาธารณะไม่ได้ ผมเลยเขียน cclayer ขึ้นมาแก้ปัญหานี้โดยเฉพาะ
cclayer คืออะไร
cclayer แยกการตั้งค่า Claude Code ออกเป็น “เลเยอร์” (layer) สองแบบ
- เลเยอร์พื้นฐาน (base): ของที่เหมือนกันทุกเครื่อง ได้แก่
CLAUDE.md,rules/,skills/,output-styles/,agents/, สคริปต์ hook, คีย์ที่ใช้ร่วมกันในsettings.json, รายการปลั๊กอินและ marketplace, และนิยาม MCP ข้างในไม่มีข้อมูลตัวตนใด ๆ เลย จึงเก็บไว้ใน repository สาธารณะได้ - เลเยอร์ซ้อนทับ (overlay): ทีมละหนึ่งเลเยอร์ เก็บตัวตน git ของทีมนั้น, hook, กฎที่อยู่ repository (เช่น
github.com/acme-inc/*) รวมถึง.claude/settings.local.jsonและCLAUDE.local.mdที่จะเขียนลงในโปรเจกต์เหล่านั้น overlay มีผลเฉพาะในโปรเจกต์ที่ตรงกฎ และไม่เขียนอะไรลง~/.claudeเลย
แต่ละเครื่องดึงแค่เลเยอร์พื้นฐานกับ overlay ที่เครื่องนั้นต้องใช้ สั่ง cclayer apply คำสั่งเดียวก็วางทุกอย่างให้เรียบร้อย สั่ง cclayer push คำสั่งเดียวก็ส่งการเปลี่ยนแปลงในเครื่องนี้กลับขึ้นไป
เลเยอร์จะเป็น git repository ก็ได้ หรือเป็นโฟลเดอร์หนึ่งในโฟลเดอร์ซิงก์ของคลาวด์ไดรฟ์ก็ได้ ไม่อยากยุ่งกับ git ก็ใช้ได้เหมือนกัน
การติดตั้ง
macOS ใช้ Homebrew
brew install --cask zhaojiannet/tap/cclayerอัปเกรดภายหลัง
brew upgrade --cask cclayerLinux และ Windows ให้ดาวน์โหลดไฟล์ binary จากหน้า Releases ต้องติดตั้ง git ไว้ก่อน ส่วนขั้นตอนเรื่องปลั๊กอินและ MCP ต้องใช้ Claude Code 2.1.288 ขึ้นไป
วิธีใช้ที่ง่ายที่สุด: คนเดียว หลายเครื่อง
ถ้าไม่มีทีมที่ต้องแยกกัน มีเลเยอร์พื้นฐานเลเยอร์เดียวก็พอ
เครื่องแรก
cclayer setupsetup เป็นหน้าจอตั้งค่าแบบเต็มจอ คอลัมน์ซ้ายคือเลเยอร์ต่าง ๆ และการตั้งค่าของเครื่องนี้ คอลัมน์ขวาคือคำอธิบายของรายการที่เลือกและช่องที่แก้ไขได้ ก่อนกดบันทึกจะไม่มีการเขียนไฟล์ใด ๆ ข้อความบนหน้าจอรองรับภาษาจีนตัวย่อ อังกฤษ และญี่ปุ่น ค่าเริ่มต้นจะตามภาษาของระบบ

กรอกแค่สองอย่าง
- เลเยอร์พื้นฐาน: ใส่ไดเรกทอรี (เช่น
~/Dropbox/cclayer/baseในคลาวด์ไดรฟ์) หรือที่อยู่ของ git repository ส่วนตัว ถ้าไดเรกทอรียังไม่มี ตอนบันทึกจะสร้างlayer.tomlเริ่มต้นให้อัตโนมัติ - ไดเรกทอรีโปรเจกต์: ไดเรกทอรีที่เก็บโค้ด เช่น
~/Projects
เลือก “Save and apply” แล้วเก็บการตั้งค่าที่มีอยู่ในเครื่องนี้เข้าเลเยอร์
cclayer capture --add CLAUDE.md --add rules/ --add skills/path อ้างอิงจาก ~/.claude ก่อนเก็บเข้าไป ทุกไฟล์จะถูกตรวจก่อน อย่างพวกคีย์ลับ อีเมล หรือ path แบบ absolute ที่ชี้ไปยัง home directory ของเครื่องนี้ จะถูกสกัดไว้และบอกด้วยว่าอยู่บรรทัดไหน ถ้าใช้คนเดียวและเก็บเลเยอร์ไว้ในที่ส่วนตัว ให้เพิ่มบรรทัด private = true ใต้ [layer] ใน layer.toml ก็จะไม่สกัดอีเมลอีก
เครื่องอื่น ๆ
ติดตั้ง cclayer แล้วรัน cclayer setup เหมือนกัน ใส่ที่อยู่เลเยอร์พื้นฐานอันเดียวกัน บันทึกและใช้งาน การตั้งค่าจากเครื่องแรกก็จะมาครบ ไฟล์ที่มีอยู่แล้วในเครื่องนี้แต่เนื้อหาต่างกันจะถูกแสดงรายการให้เลือกว่าจะเขียนทับหรือไม่ ก่อนเขียนทับไฟล์เก่าจะถูกสำรองไว้ที่ ~/.local/state/cclayer/backups/
การซิงก์ประจำวัน
ถ้าใช้ git repository เป็นเลเยอร์
cclayer push # อัปโหลด: รวบรวมการเปลี่ยนแปลงในเครื่อง แสดงสิ่งที่จะ commit ยืนยันแล้ว commit และ pushcclayer apply --pull # ดาวน์โหลด: ดึงเลเยอร์ล่าสุด แล้ววางลงเครื่องนี้ถ้าใช้โฟลเดอร์คลาวด์ไดรฟ์เป็นเลเยอร์ การซิงก์ให้คลาวด์ไดรฟ์จัดการ แก้เสร็จแล้วรัน cclayer capture อีกเครื่องรัน cclayer apply ก็เรียบร้อย
ยังเอา SessionStart hook ด้านล่างนี้ใส่ไว้ใน claude/settings.json ของเลเยอร์พื้นฐาน แล้วเปิด “Auto pull” ใน setup ได้ด้วย หลังจากนั้นทุกครั้งที่เปิดเซสชัน Claude Code จะดึงและใช้งานเลเยอร์ให้อัตโนมัติ
{ "hooks": { "SessionStart": [{ "matcher": "startup", "hooks": [{ "type": "command", "command": "command -v cclayer >/dev/null && cclayer apply --hook || true" }] }] }}ตั้งค่าตัวตน git ที่ต่างกันให้แต่ละทีม
นี่คือเหตุผลหลักที่ผมเขียน cclayer เริ่มจากสร้าง repository ส่วนตัวให้ทีม ที่ root วางไฟล์ layer.toml ระบุตัวตนและ repository ที่ต้องการให้ตรงกฎ
[layer]name = "acme"kind = "overlay"
[identity]name = "Full Name"email = "me@acme.example"
[[match]]remote = "github.com/acme-inc/*"จากนั้นเพิ่ม overlay นี้ในเครื่องที่ต้องใช้ มันจะถามว่าจะตั้งค่าข้อมูลรับรองสำหรับเข้าถึง repository อย่างไร แล้ว clone ลงมาตรวจหนึ่งรอบ
cclayer layer add acme git@github.com:you/cclayer-acme.gitหลัง apply แล้ว cclayer จะเพิ่มบล็อก include ไว้ท้าย ~/.gitconfig โดยใช้ includeIf "hasconfig:remote.*.url:..." ของ git ให้ตัวตนนี้มีผลเฉพาะใน repository ที่ที่อยู่ remote ตรงกับ github.com/acme-inc/* เนื้อหาเดิมใน ~/.gitconfig ไม่ถูกแตะเลย ถ้าปล่อยตัวตนเริ่มต้น (default_identity) ว่างไว้ repository ที่ไม่ตรงกับ overlay ใดเลย git จะปฏิเสธการ commit จะไม่เกิดกรณี commit ด้วยอีเมลผิดอีก
กฎการจับคู่ต้องระบุ host และองค์กรให้ชัด จะใช้ wildcard แทนไม่ได้ เพื่อไม่ให้ overlay ของทีมหนึ่งไปอ้างสิทธิ์ repository ของทีมอื่น
ถ้าอยากให้การล็อกอิน เซสชัน และประวัติพรอมต์ของ Claude Code แยกขาดจากกันตามทีมด้วย ให้เปิดโหมด profiles แต่ละ overlay จะมีไดเรกทอรีการตั้งค่าของตัวเองที่ ~/.claude-profiles/<ชื่อเลเยอร์> คำสั่ง cclayer env จะแสดง CLAUDE_CONFIG_DIR ที่ตรงกัน ใช้คู่กับ direnv แล้วเข้าโปรเจกต์ไหนก็ใช้การตั้งค่าชุดของโปรเจกต์นั้น
เรื่องความปลอดภัย
hook และ skills ที่ซิงก์มาจะถูก Claude Code รันในเครื่องนี้ cclayer จึงค่อนข้างระวังในเรื่องนี้
- การตั้งค่าที่รันโปรแกรมหรือเปิดใช้ปลั๊กอินได้ อย่าง
hooks,statusLine,enabledPluginsรวมถึงไฟล์ใต้hooks/,skills/และไฟล์ที่มีสิทธิ์ execute ก่อนเขียนจะแสดงเนื้อหาให้ยืนยันก่อนเสมอ เนื้อหาเดียวกันยืนยันครั้งเดียวแล้วจะไม่ถามซ้ำ - ส่วนย่อยของการตั้งค่า git อนุญาตเฉพาะค่าทั่วไปอย่าง
pull.rebase,push.defaultส่วนคีย์ที่รันโปรแกรมได้อย่าง alias,core.hooksPath,credential.helperต้องระบุชัดในรายการอุปกรณ์ว่าเชื่อถือเลเยอร์นั้นจึงจะใช้ได้ - สถานะการล็อกอินของ Claude Code,
history.jsonl,projects/จะไม่ถูกอ่านเข้าเลเยอร์ ส่วนpermissions.allowและenvอยู่ในเครื่องนี้เท่านั้น - ในเลเยอร์ห้ามมี symbolic link และตอนเขียนไฟล์ก็จะไม่ตาม symbolic link
คำสั่งที่ใช้บ่อย
| คำสั่ง | หน้าที่ |
|---|---|
cclayer setup | หน้าจอตั้งค่าแบบเต็มจอ ใช้ทั้งตั้งค่าครั้งแรกและแก้ไขภายหลัง |
cclayer apply | วางทุกเลเยอร์ลงเครื่องนี้ --pull จะดึงก่อน |
cclayer capture | เขียนการเปลี่ยนแปลงในเครื่องกลับเข้าเลเยอร์ ไม่ commit |
cclayer push | capture แล้ว commit และ push repository ของแต่ละเลเยอร์ |
cclayer check | ตรวจว่าในเลเยอร์มีเนื้อหาที่ไม่ควรมีหรือไม่ |
cclayer status | สถานะ git ของแต่ละเลเยอร์และโปรเจกต์ที่ตรงกฎ |
cclayer keys setup <เลเยอร์> | ตั้งค่าข้อมูลรับรองสำหรับเข้าถึง repository ของเลเยอร์ในเครื่องนี้ (deploy key หรือ HTTPS token) |
cclayer layer add <ชื่อ> <ที่อยู่> | เพิ่ม overlay หนึ่งตัวให้เครื่องนี้ |
cclayer leave <เลเยอร์> | ถอดเลเยอร์หนึ่งออกจากเครื่องนี้ และล้างสิ่งที่มันเคยเขียนไว้ |
cclayer doctor | ตรวจปัญหาที่พบบ่อยของ Claude Code และ git |
วิธีใช้แบบละเอียดกว่านี้ รวมถึงการสร้าง git repository ข้อมูลรับรองของ repository ส่วนตัว และคำถามที่พบบ่อย ดูได้ที่บทแนะนำ cclayer (ภาษาอังกฤษ)
ที่อยู่โปรเจกต์บน GitHub https://github.com/zhaojiannet/cclayer