ฟีเจอร์
การตรวจสอบและซ่อมแซม
หน้านี้แปลด้วยเครื่องจากภาษาอังกฤษ ยินดีรับการแก้ไข แก้ไขหน้านี้บน GitHub
ccam doctor ตรวจสอบการติดตั้ง ccam ของคุณ ได้แก่ ไบนารีของ Claude Code โฟลเดอร์ การเข้าสู่ระบบ และลิงก์ที่ใช้ร่วมกันของทุกบัญชี เซิร์ฟเวอร์ MCP ที่ใช้ร่วมกัน endpoint การใช้งาน และคำสั่งลัดของคุณ ccam doctor --fix ซ่อมแซมส่วนที่ทำได้โดยไม่ทำให้ข้อมูลสูญหาย และย้ายไฟล์ที่จะถูกแทนที่ไปไว้ในโฟลเดอร์สำรองก่อน ให้รันคำสั่งนี้เมื่อ ccam <name> หยุดทำงานเพราะปัญหาลิงก์ที่ใช้ร่วมกัน หลังจากที่คุณกู้คืนไฟล์ด้วยตัวเอง หรือหลังจากอัปเดต Claude Code
การใช้งาน
ccam doctor # check everything, change nothing
ccam doctor --fix # check, then repair what is safe to repair
ccam --dry-run doctor --fix # report only: what --fix would repairผลการตรวจแต่ละรายการคือหนึ่งบรรทัดพร้อมเครื่องหมาย: ✓ ปกติ, · ข้อมูล, ! คำเตือน, ✗ ข้อผิดพลาด ผลการตรวจของบัญชีจะขึ้นต้นด้วยชื่อบัญชี
$ ccam doctor
✓ Claude Code 2.1.302 (Claude Code) (/home/me/.local/bin/claude)
! personal: folder permissions are 755 (should be 0700)
! personal: .credentials.json permissions are 644 (should be 0600)
✓ personal: login valid (me@example.com)
✗ personal: /home/me/.local/share/ccam/profiles/personal/settings.json: set to shared but is a real file, not a link
· personal: unknown entries (Claude Code layout may have changed): newthing
! work: not logged in → `ccam login work`
✓ work: share links OK
! missing shortcuts in /home/me/.local/bin: ccp
`ccam doctor --fix` repairs what it can.เมื่อใช้ --fix ผลการตรวจทุกรายการที่ซ่อมแล้วจะลงท้ายด้วย → fixed:
$ ccam doctor --fix
✓ Claude Code 2.1.302 (Claude Code) (/home/me/.local/bin/claude)
! personal: folder permissions are 755 (should be 0700) → fixed
! personal: .credentials.json permissions are 644 (should be 0600) → fixed
✓ personal: login valid (me@example.com)
✗ personal: /home/me/.local/share/ccam/profiles/personal/settings.json: set to shared but is a real file, not a link → fixed
· personal: unknown entries (Claude Code layout may have changed): newthing
! work: not logged in → `ccam login work`
✓ work: share links OK
! missing shortcuts in /home/me/.local/bin: ccp → fixedตัวเลือก
| ตัวเลือก | สิ่งที่ทำ | ค่าเริ่มต้น |
|---|---|---|
--fix |
ซ่อมแซมส่วนที่ซ่อมได้อย่างปลอดภัย (ไฟล์ที่เปลี่ยนจะถูกสำรองไว้) | ปิด |
--dry-run (global) |
รันการตรวจทุกรายการแต่ไม่ซ่อมสิ่งใด แม้จะใส่ --fix |
ปิด |
ccam doctor ไม่รับอาร์กิวเมนต์ และรองรับ --dry-run: ccam --dry-run doctor --fix พิมพ์ผลการตรวจเหมือนกับ ccam doctor และไม่เปลี่ยนแปลงสิ่งใด
รหัสออก (exit code) เป็น 1 เมื่อยังมีผลการตรวจ ✗ อย่างน้อยหนึ่งรายการที่ไม่ได้ซ่อม และเป็น 0 ในกรณีอื่น คำเตือนและข้อมูลไม่ทำให้การรันล้มเหลว เมื่อการรันล้มเหลวโดยไม่ได้ใส่ --fix ccam จะจบด้วยบรรทัดว่างและ `ccam doctor --fix` repairs what it can. การตั้งค่าที่โหลดไม่ได้ก็จะจบด้วย 1 และข้อผิดพลาด ccam: เช่นกัน
วิธีการทำงาน
internal/cli/doctor.go โหลด ~/.config/ccam/config.toml แล้วเรียก doctor.Run ใน internal/doctor/doctor.go ซึ่งรันการตรวจตามลำดับที่กำหนดไว้และส่งผลการตรวจกลับมา --fix ถูกส่งต่อเป็น Options.Fix และตั้งเป็น false เมื่อเป็นการทดลองรัน (dry run)
ส่วนตรงกลางจะรันหนึ่งครั้งต่อบัญชี การตรวจแต่ละรายการและสิ่งที่ --fix ทำ:
- เวอร์ชันของ Claude Code (
checkClaude) หาไบนารีclaudeแบบเดียวกับที่ตัวเริ่มโปรแกรมทำ แล้วรันclaude --versionหากเวอร์ชันไม่ขึ้นต้นด้วย2.1.302ซึ่งเป็นเวอร์ชันที่ใช้ยืนยันโครงสร้างโฟลเดอร์ของ ccam (doctor.LayoutVersion) จะเพิ่มข้อความ· ccam was verified against the folder layout of Claude Code 2.1.302. Any 'unknown entries' below may mean the layout changedไบนารีที่หาไม่พบหรือ--versionที่ล้มเหลวถือเป็นข้อผิดพลาด ไม่มีการซ่อม - ข้อมูลเข้าสู่ระบบในตัวแปรสภาพแวดล้อม (
checkAuthEnv) เตือนเมื่อมีการตั้งCLAUDE_CODE_OAUTH_TOKEN,ANTHROPIC_API_KEYหรือANTHROPIC_AUTH_TOKENเพราะทุกบัญชีที่เริ่มจากเชลล์นั้นจะได้รับค่านี้ไปด้วย และ Claude Code จะใช้ค่านี้ก่อนการเข้าสู่ระบบของบัญชีเอง ไม่มีการซ่อม ให้ยกเลิกการตั้งค่าเอง - โฟลเดอร์ (
checkProfile) โฟลเดอร์บัญชีที่หายไปถือเป็นข้อผิดพลาดและยุติการตรวจของบัญชีนั้น สิทธิ์ที่มีบิตของ group หรือ other ตั้งอยู่ถือเป็นคำเตือน และ--fixจะรันchmod 0700 - ไฟล์เข้าสู่ระบบ (
checkCredentials) ตรวจ.credentials.jsonด้วยlstatลิงก์สัญลักษณ์ถือเป็นข้อผิดพลาด เพราะแต่ละบัญชีต้องมีโทเค็นของตัวเอง และจะไม่ถูกซ่อม โหมดที่ไม่ใช่0600ถือเป็นคำเตือน และ--fixจะรันchmod 0600จากนั้นจะอ่านการเข้าสู่ระบบ (บน macOS จะอ่านจากพวงกุญแจ (Keychain) ก่อน) หากไม่มีการเข้าสู่ระบบจะเป็นคำเตือนที่แนะนำccam login <name>refresh token ที่หมดอายุคือข้อผิดพลาดlogin expiredส่วน access token ที่หมดอายุเป็นเพียงข้อมูล เพราะ Claude Code จะต่ออายุให้เมื่อเริ่มครั้งถัดไป รายการเหล่านี้จะไม่ถูกซ่อม - ลิงก์ที่ใช้ร่วมกัน (
share.Check) เปรียบเทียบทุกพาธในshare.Layoutกับการตั้งค่าการใช้ร่วมกันของบัญชี โดยใช้เพียงlstatและreadlinkรายงานปัญหาสี่แบบ ได้แก่ ลิงก์ที่หายไป ลิงก์ที่ชี้ไปที่อื่น ไฟล์จริงในตำแหน่งที่ควรเป็นลิงก์ และลิงก์ที่หลงเหลืออยู่ของรายการที่ตอนนี้เป็นของบัญชีเอง ลิงก์ที่หายไปถือเป็นคำเตือน ส่วนแบบอื่นถือเป็นข้อผิดพลาด - รายการที่ไม่รู้จัก (
checkUnknownEntries) แสดงชื่อระดับบนสุดในโฟลเดอร์บัญชีที่ ccam ไม่รู้จัก (share.Known) เพื่อบอกเป็นนัยว่าโครงสร้างของ Claude Code อาจเปลี่ยนไป เป็นข้อมูลเท่านั้น - พาธปลั๊กอิน (
checkPlugins) รีจิสทรีปลั๊กอิน (installed_plugins.json,known_marketplaces.json) เก็บพาธแบบสัมบูรณ์ ในplugins/ของแต่ละกลุ่ม พาธที่ผ่านโฟลเดอร์ของบัญชีหนึ่งจะใช้ไม่ได้เมื่อบัญชีนั้นถูกลบหรือเปลี่ยนชื่อ--fixจะเขียนพาธเหล่านั้นใหม่ให้ชี้ไปที่โฟลเดอร์ของกลุ่มด้วยprofile.RewritePluginPathsซึ่งเขียนไฟล์รีจิสทรีแบบ atomic - เซิร์ฟเวอร์ MCP (
checkMCP) โหลดmcp.jsonของแต่ละกลุ่มหนึ่งครั้ง ไฟล์ที่อ่านไม่ได้ถือเป็นข้อผิดพลาด และเซิร์ฟเวอร์ที่ไม่ผ่านmcp.Validateถือเป็นคำเตือน ไม่มีการซ่อม - รูปแบบคำตอบการใช้งาน (
checkUsageFormat) สอบถาม endpoint การใช้งานโดยไม่ใช้แคชและจำกัดเวลา 3 วินาทีตามปกติ ทีละบัญชีจนกว่าจะมีบัญชีที่ได้รับคำตอบ หากพาร์สคำตอบไม่ได้แล้ว จะเตือนว่าccam usageจะหันไปใช้แคชของแถบสถานะแทน นี่เป็นการตรวจเพียงรายการเดียวที่ใช้เครือข่าย - คำสั่งลัด (
checkShims) ตรวจเฉพาะเมื่อมีบัญชีที่มีคำสั่งลัด ลิงก์ที่หายไปใน~/.local/binถือเป็นคำเตือน และ--fixจะเรียกshim.Installซึ่งสร้างเฉพาะลิงก์ที่หายไปและไม่แตะไฟล์อื่นเลย โฟลเดอร์ bin ที่ไม่อยู่ในPATHถือเป็นคำเตือนและจะไม่ถูกซ่อม
การซ่อมลิงก์ที่ใช้ร่วมกัน
เส้นทางการเริ่มโปรแกรมจะสร้างลิงก์ที่หายไปให้ทันที แต่จะหยุดเมื่อพบสิ่งใดที่อาจทำให้ข้อมูลสูญหาย และแนะนำให้มาที่คำสั่งนี้:
$ ccam work
ccam: stopped because of share link problems:
/home/me/.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สำหรับปัญหาลิงก์ที่ใช้ร่วมกันทุกแบบ --fix จะเรียก share.Build โดยใช้การตั้งค่าการใช้ร่วมกันของบัญชีเป็นทั้งสถานะปัจจุบันและสถานะเป้าหมาย แล้วตามด้วย Plan.Apply Build สร้างทุกขั้นตอนขึ้นใหม่จากสิ่งที่อยู่บนดิสก์ ซึ่งเป็นแผนเดียวกับที่ ccam share ใช้ การซ่อมจึงทำตามกฎเดียวกับการเปิดใช้งานการใช้ร่วมกัน
ในตัวอย่างนี้ settings.json เป็นไฟล์จริง เนื่องจากกลุ่มมี settings.json ที่ต่างกันอยู่แล้ว ความขัดแย้งจึงใช้ตัวเลือกเริ่มต้น KeepGroup และสำเนาของกลุ่มยังคงอยู่ ไฟล์ของบัญชีจะถูกย้ายไปที่ .ccam-backup/<time>/settings.json ภายในโฟลเดอร์ของบัญชี และ os.Symlink จะลิงก์พาธนั้นไปยังกลุ่ม กรณีอื่น ๆ:
- หากกลุ่มยังไม่มีสำเนา ไฟล์ของบัญชีจะถูกย้ายเข้าไปในกลุ่มและกลายเป็นเนื้อหาแรกของกลุ่ม
- สำหรับโฟลเดอร์ ไฟล์ที่กลุ่มยังไม่มีจะถูกย้ายเข้าไปในกลุ่ม ส่วนที่เหลือจะไปอยู่ในที่สำรอง
- สำหรับ
history.jsonlค่าเริ่มต้นคือmerge by line: บรรทัดของกลุ่มก่อน แล้วตามด้วยบรรทัดใหม่ของคุณ สำเนาเดิมของกลุ่มจะถูกเก็บไว้ใน.ccam-backup/<time>/group/ - ลิงก์ที่ชี้ไปยังกลุ่มอื่นจะถูกแทนที่ ลิงก์ที่ชี้ไปยังโฟลเดอร์นอก ccam จะไปอยู่ในที่สำรอง และเนื้อหาของโฟลเดอร์นั้นจะกลายเป็นเนื้อหาเริ่มต้นของกลุ่มหากกลุ่มยังว่างอยู่
- ลิงก์ที่หลงเหลืออยู่ของรายการที่ตอนนี้เป็นของบัญชีเองจะถูกลบ และบัญชีจะได้รับสำเนาของเนื้อหาในกลุ่ม
นอกจากการลบลิงก์แล้ว ทุกขั้นตอนจะย้ายข้อมูลเข้าไปในกลุ่มหรือโฟลเดอร์สำรอง ไม่มีสิ่งใดถูกลบทิ้ง
ความปลอดภัยและกรณีพิเศษ
ccam doctorแบบธรรมดาจะไม่เปลี่ยนแปลงสิ่งใดเลย ในสคริปต์ให้ใช้--dry-runคู่กับ--fixเพื่อความแน่ใจdoctor --fixไม่ตรวจสอบว่าบัญชีกำลังทำงานอยู่หรือไม่ ให้ออกจาก Claude Code ของบัญชีนั้นก่อนซ่อมลิงก์ที่ใช้ร่วมกัน เพราะเซสชันยังคงเขียนลงไฟล์เหล่านั้น- หากการซ่อมการใช้ร่วมกันล้มเหลว ccam จะรายงาน
could not repair share links: <error>สำหรับบัญชีนั้นและข้ามการตรวจรายการที่ไม่รู้จัก บัญชีอื่นยังคงถูกตรวจตามปกติ - หาก
ccam shareล้มเหลวกลางคัน จะบันทึกการตั้งค่าเป้าหมายไว้ก่อน แล้วบอกให้คุณทำต่อให้เสร็จด้วยccam doctor --fix .credentials.jsonที่เป็นลิงก์สัญลักษณ์ การเข้าสู่ระบบที่หมดอายุ และข้อมูลเข้าสู่ระบบในตัวแปรสภาพแวดล้อม จะถูกรายงานแต่ไม่ถูกเปลี่ยนแปลง- การเขียนรีจิสทรีปลั๊กอินใหม่จะเขียนแบบ atomic แต่ไม่ได้คัดลอกไปไว้ใน
.ccam-backup/