ฟีเจอร์

การตรวจสอบและซ่อมแซม

อัปเดตล่าสุด 19 ตุลาคม 2569
ตรวจสอบกับ ccam 0.6.0 และ Claude Code 2.1.302

หน้านี้แปลด้วยเครื่องจากภาษาอังกฤษ ยินดีรับการแก้ไข แก้ไขหน้านี้บน 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 ทำ:

  1. เวอร์ชันของ 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 ที่ล้มเหลวถือเป็นข้อผิดพลาด ไม่มีการซ่อม
  2. ข้อมูลเข้าสู่ระบบในตัวแปรสภาพแวดล้อม (checkAuthEnv) เตือนเมื่อมีการตั้ง CLAUDE_CODE_OAUTH_TOKEN, ANTHROPIC_API_KEY หรือ ANTHROPIC_AUTH_TOKEN เพราะทุกบัญชีที่เริ่มจากเชลล์นั้นจะได้รับค่านี้ไปด้วย และ Claude Code จะใช้ค่านี้ก่อนการเข้าสู่ระบบของบัญชีเอง ไม่มีการซ่อม ให้ยกเลิกการตั้งค่าเอง
  3. โฟลเดอร์ (checkProfile) โฟลเดอร์บัญชีที่หายไปถือเป็นข้อผิดพลาดและยุติการตรวจของบัญชีนั้น สิทธิ์ที่มีบิตของ group หรือ other ตั้งอยู่ถือเป็นคำเตือน และ --fix จะรัน chmod 0700
  4. ไฟล์เข้าสู่ระบบ (checkCredentials) ตรวจ .credentials.json ด้วย lstat ลิงก์สัญลักษณ์ถือเป็นข้อผิดพลาด เพราะแต่ละบัญชีต้องมีโทเค็นของตัวเอง และจะไม่ถูกซ่อม โหมดที่ไม่ใช่ 0600 ถือเป็นคำเตือน และ --fix จะรัน chmod 0600 จากนั้นจะอ่านการเข้าสู่ระบบ (บน macOS จะอ่านจากพวงกุญแจ (Keychain) ก่อน) หากไม่มีการเข้าสู่ระบบจะเป็นคำเตือนที่แนะนำ ccam login <name> refresh token ที่หมดอายุคือข้อผิดพลาด login expired ส่วน access token ที่หมดอายุเป็นเพียงข้อมูล เพราะ Claude Code จะต่ออายุให้เมื่อเริ่มครั้งถัดไป รายการเหล่านี้จะไม่ถูกซ่อม
  5. ลิงก์ที่ใช้ร่วมกัน (share.Check) เปรียบเทียบทุกพาธใน share.Layout กับการตั้งค่าการใช้ร่วมกันของบัญชี โดยใช้เพียง lstat และ readlink รายงานปัญหาสี่แบบ ได้แก่ ลิงก์ที่หายไป ลิงก์ที่ชี้ไปที่อื่น ไฟล์จริงในตำแหน่งที่ควรเป็นลิงก์ และลิงก์ที่หลงเหลืออยู่ของรายการที่ตอนนี้เป็นของบัญชีเอง ลิงก์ที่หายไปถือเป็นคำเตือน ส่วนแบบอื่นถือเป็นข้อผิดพลาด
  6. รายการที่ไม่รู้จัก (checkUnknownEntries) แสดงชื่อระดับบนสุดในโฟลเดอร์บัญชีที่ ccam ไม่รู้จัก (share.Known) เพื่อบอกเป็นนัยว่าโครงสร้างของ Claude Code อาจเปลี่ยนไป เป็นข้อมูลเท่านั้น
  7. พาธปลั๊กอิน (checkPlugins) รีจิสทรีปลั๊กอิน (installed_plugins.json, known_marketplaces.json) เก็บพาธแบบสัมบูรณ์ ใน plugins/ ของแต่ละกลุ่ม พาธที่ผ่านโฟลเดอร์ของบัญชีหนึ่งจะใช้ไม่ได้เมื่อบัญชีนั้นถูกลบหรือเปลี่ยนชื่อ --fix จะเขียนพาธเหล่านั้นใหม่ให้ชี้ไปที่โฟลเดอร์ของกลุ่มด้วย profile.RewritePluginPaths ซึ่งเขียนไฟล์รีจิสทรีแบบ atomic
  8. เซิร์ฟเวอร์ MCP (checkMCP) โหลด mcp.json ของแต่ละกลุ่มหนึ่งครั้ง ไฟล์ที่อ่านไม่ได้ถือเป็นข้อผิดพลาด และเซิร์ฟเวอร์ที่ไม่ผ่าน mcp.Validate ถือเป็นคำเตือน ไม่มีการซ่อม
  9. รูปแบบคำตอบการใช้งาน (checkUsageFormat) สอบถาม endpoint การใช้งานโดยไม่ใช้แคชและจำกัดเวลา 3 วินาทีตามปกติ ทีละบัญชีจนกว่าจะมีบัญชีที่ได้รับคำตอบ หากพาร์สคำตอบไม่ได้แล้ว จะเตือนว่า ccam usage จะหันไปใช้แคชของแถบสถานะแทน นี่เป็นการตรวจเพียงรายการเดียวที่ใช้เครือข่าย
  10. คำสั่งลัด (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/