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

> ตรวจสอบลิงก์ที่ใช้ร่วมกัน สิทธิ์ของไฟล์ การเข้าสู่ระบบ และเวอร์ชันของ Claude Code ด้วย ccam doctor และซ่อมแซมส่วนที่ซ่อมได้อย่างปลอดภัยด้วย ccam doctor --fix

Source: https://ccam.dev/th/features/doctor/ · Updated 2026-10-19

`ccam doctor` ตรวจสอบการติดตั้ง ccam ของคุณ ได้แก่ ไบนารีของ Claude Code โฟลเดอร์ การเข้าสู่ระบบ และลิงก์ที่ใช้ร่วมกันของทุกบัญชี เซิร์ฟเวอร์ MCP ที่ใช้ร่วมกัน endpoint การใช้งาน และคำสั่งลัดของคุณ `ccam doctor --fix` ซ่อมแซมส่วนที่ทำได้โดยไม่ทำให้ข้อมูลสูญหาย และย้ายไฟล์ที่จะถูกแทนที่ไปไว้ในโฟลเดอร์สำรองก่อน ให้รันคำสั่งนี้เมื่อ `ccam <name>` หยุดทำงานเพราะปัญหาลิงก์ที่ใช้ร่วมกัน หลังจากที่คุณกู้คืนไฟล์ด้วยตัวเอง หรือหลังจากอัปเดต Claude Code

## การใช้งาน

```sh
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
```

ผลการตรวจแต่ละรายการคือหนึ่งบรรทัดพร้อมเครื่องหมาย: `✓` ปกติ, `·` ข้อมูล, `!` คำเตือน, `✗` ข้อผิดพลาด ผลการตรวจของบัญชีจะขึ้นต้นด้วยชื่อบัญชี

```console
$ 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`:

```console
$ 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` ถือเป็นคำเตือนและจะไม่ถูกซ่อม

### การซ่อมลิงก์ที่ใช้ร่วมกัน

เส้นทางการเริ่มโปรแกรมจะสร้างลิงก์ที่หายไปให้ทันที แต่จะหยุดเมื่อพบสิ่งใดที่อาจทำให้ข้อมูลสูญหาย และแนะนำให้มาที่คำสั่งนี้:

```console
$ 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/`

## หัวข้อที่เกี่ยวข้อง

- [ใช้เซิร์ฟเวอร์ MCP การตั้งค่า และประวัติร่วมกัน](https://ccam.dev/th/docs/sharing.md)
- [การคัดลอกการตั้งค่าที่มีอยู่](https://ccam.dev/th/features/migrate.md)
- [ขีดจำกัดการใช้งานและการสลับบัญชี](https://ccam.dev/th/docs/usage-limits.md)
- [คำสั่ง](https://ccam.dev/th/docs/commands.md)
