บันทึกเทคนิคของ zhaoJian

ซิงก์การตั้งค่า Claude Code (CLAUDE.md, skills, ปลั๊กอิน, MCP) ระหว่างหลายเครื่องด้วย cclayer และแยกตัวตน git ตามทีม

เทคโนโลยี ~8202 คำ · อ่าน 21 นาที - ครั้งที่อ่าน

พอใช้ 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

Terminal window
brew install --cask zhaojiannet/tap/cclayer

อัปเกรดภายหลัง

Terminal window
brew upgrade --cask cclayer

Linux และ Windows ให้ดาวน์โหลดไฟล์ binary จากหน้า Releases ต้องติดตั้ง git ไว้ก่อน ส่วนขั้นตอนเรื่องปลั๊กอินและ MCP ต้องใช้ Claude Code 2.1.288 ขึ้นไป

วิธีใช้ที่ง่ายที่สุด: คนเดียว หลายเครื่อง

ถ้าไม่มีทีมที่ต้องแยกกัน มีเลเยอร์พื้นฐานเลเยอร์เดียวก็พอ

เครื่องแรก

Terminal window
cclayer setup

setup เป็นหน้าจอตั้งค่าแบบเต็มจอ คอลัมน์ซ้ายคือเลเยอร์ต่าง ๆ และการตั้งค่าของเครื่องนี้ คอลัมน์ขวาคือคำอธิบายของรายการที่เลือกและช่องที่แก้ไขได้ ก่อนกดบันทึกจะไม่มีการเขียนไฟล์ใด ๆ ข้อความบนหน้าจอรองรับภาษาจีนตัวย่อ อังกฤษ และญี่ปุ่น ค่าเริ่มต้นจะตามภาษาของระบบ

ภาพหน้าจอการตั้งค่าแบบเต็มจอของ cclayer setup: คอลัมน์ซ้ายเป็นการตั้งค่าเลเยอร์พื้นฐาน ไดเรกทอรีโปรเจกต์ ตำแหน่ง clone ในเครื่อง การดึงอัตโนมัติ ฯลฯ คอลัมน์ขวาเป็นคำอธิบายรายการที่เลือก ด้านล่างมีปุ่มบันทึกและใช้งาน บันทึกอย่างเดียว และออก

กรอกแค่สองอย่าง

  1. เลเยอร์พื้นฐาน: ใส่ไดเรกทอรี (เช่น ~/Dropbox/cclayer/base ในคลาวด์ไดรฟ์) หรือที่อยู่ของ git repository ส่วนตัว ถ้าไดเรกทอรียังไม่มี ตอนบันทึกจะสร้าง layer.toml เริ่มต้นให้อัตโนมัติ
  2. ไดเรกทอรีโปรเจกต์: ไดเรกทอรีที่เก็บโค้ด เช่น ~/Projects

เลือก “Save and apply” แล้วเก็บการตั้งค่าที่มีอยู่ในเครื่องนี้เข้าเลเยอร์

Terminal window
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 เป็นเลเยอร์

Terminal window
cclayer push # อัปโหลด: รวบรวมการเปลี่ยนแปลงในเครื่อง แสดงสิ่งที่จะ commit ยืนยันแล้ว commit และ push
cclayer 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 ลงมาตรวจหนึ่งรอบ

Terminal window
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 pushcapture แล้ว 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

แชร์:

ความคิดเห็น