# Claude Code — SAKOOL_CHk Project Context

## Project Identity

โปรเจกต์นี้คือ **SAKOOL_CHk / ClassCARE** — ระบบเช็คชื่อนักเรียนสำหรับครูแบบ Node.js + Express + SQLite

แนวคิดหลักของระบบ:
- ครู 1 คน = ฐานข้อมูล SQLite แยกของตัวเอง 1 ใบ หรือที่ในโปรเจกต์เรียกว่า **กระเป๋าครู**
- มีฐานข้อมูลกลาง `storage/system.sqlite` สำหรับผู้ใช้ แพ็กเกจ โมดูล subscription และ admin
- มีฐานข้อมูลรายครูใน `storage/teachers/<teacher-code>/database.sqlite`
- Frontend เป็น static HTML/CSS/JS แยกตามบทบาทใน `public/*`
- Backend เป็น Express API ใน `src/routes/*`

ชื่อระบบที่เจอในโปรเจกต์:
- package name: `class-care-node`
- API health name: `ClassCARE API`
- คำอธิบาย package: `ระบบเช็คชื่อครูแบบแยกกระเป๋า SQLite รายครู`

---

## Pending Tasks / Roadmap

> รายการสิ่งที่**ยังไม่ได้ทำ** — ทำตามลำดับ (mark `[x]` เมื่อเสร็จ) — Last updated: 2026-04-30

### 🔴 จำเป็น (ส่งผลต่อรายได้/ใช้งาน)

- [ ] **1. ระบบ Upgrade/Downgrade แพ็คเกจ** (prorated)
  - ตอนนี้มีแค่ "ต่ออายุ" — ไม่มี endpoint upgrade/downgrade คำนวณส่วนต่าง
  - ดีไซน์ที่คุยไว้: daily rate prorate (Upgrade เก็บเงินส่วนต่าง / Downgrade แปลงเป็นวันเพิ่ม)
  - ต้องสร้าง: `plan_changes` table, `POST /api/admin/teachers/:id/preview-change`, `POST /change-plan`
  - UI admin: modal preview before confirm
  - User confirmed: A) Downgrade = แปลงเป็นวันเพิ่ม (ไม่คืนเงิน) + B) Admin "ยืนยันรับเงิน" หลังครูโอน

- [ ] **2. ระบบผู้ปกครอง (Parent Portal)**
  - Schema มีแล้ว: `parent_links`, `parent_line_index`, module key `parent_portal`
  - **ยังไม่มี:** endpoint, LIFF flow, dashboard
  - Pro plan only

- [ ] **3. ตรวจอัตนัย/เติมคำของแบบทดสอบ (Manual grading)**
  - คำตอบเก็บในตาราง `test_answers` (essay/short_answer มี `score: null`)
  - **ยังไม่มี UI:** ครูดูคำตอบ + ใส่คะแนน + comment
  - ต้องการ: หน้า "ดูคะแนน" → คลิกนักเรียน → grading UI
  - หลังตรวจครบ → update `attempt.graded_score` + status='graded'

### 🟠 สำคัญ (ลูกค้าจะถามถึง)

- [ ] **4. แบบทดสอบ Phase 2-3**
  - ⏰ Time limit + countdown timer (มี `duration_minutes` แต่ไม่บังคับ)
  - 🔀 Shuffle questions/choices (มี checkbox แต่ยังไม่ทำงาน)
  - 🔒 Password protect (มี field `password` แต่ยังไม่เช็ค)
  - 🖼 Image upload ในคำถาม (ตอนนี้รับ URL string เท่านั้น)
  - 📁 File upload questions (ประเภทใหม่)

- [ ] **5. Test Analytics**
  - คะแนนเฉลี่ย / สูงสุด / ต่ำสุด / S.D.
  - กราฟกระจายคะแนน (histogram)
  - Item analysis (ข้อยาก/ง่าย, % ตอบถูก)
  - เปรียบเทียบห้อง (ถ้า test เดียวกันใช้หลายห้อง)
  - Pro feature

- [ ] **6. แจ้งเตือน LINE อัตโนมัติ**
  - ถูกปิดไปตอนแก้ปัญหา 503 (worker exhaustion จาก SSE)
  - ต้องการ:
    - Cron job แจ้งเตือนแพ็คใกล้หมดอายุ (3 วัน, 1 วัน)
    - แจ้งนักเรียนเรื่องการบ้านครบกำหนด
    - แจ้งครูเรื่องนักเรียนส่งงานใหม่
  - ใช้ LINE OA push API (ไม่ใช่ SSE)

### 🟡 น่ามี (เพิ่ม UX)

- [ ] **7. Payment log + slip upload**
  - ตอนนี้กดต่ออายุแล้วไม่มี log
  - ตาราง `payments` มีแล้ว แต่ไม่ใช้
  - ต้องการ: admin "ยืนยันรับเงิน" + slip upload + log

- [ ] **8. Gradebook UI ฝั่งครู**
  - มี endpoint `/api/teacher/gradebook` แล้ว
  - UI ครูยัง stub (เคยถูกลบเพราะหน้า render ขาด)
  - ต้องการ: หน้าสมุดคะแนนรายห้อง รายวิชา

- [ ] **9. Question Bank**
  - คลังคำถาม reuse ในข้อสอบหลายชุด
  - Random pick: เอา N ข้อจาก pool

- [ ] **10. Bulk LINE Push (ครู → นักเรียน)**
  - ครูส่งข้อความถึงนักเรียนหลายคนพร้อมกัน
  - admin → ครู มีแล้ว
  - ครู → นักเรียน ยังไม่มี

### 🟢 เก็บไว้ทำทีหลัง

- [ ] **11. Module gating ที่ยังไม่ enforced**
  - `reports`, `scores` ฝั่ง backend ยังไม่มี `requireModule()` กั้น
  - ต้องเพิ่มที่ teacher.routes.js endpoints

- [ ] **12. SuperAdmin / Multi-admin**
  - ตอนนี้มี admin คนเดียว
  - ต้องแยก role: superadmin / staff / sales / support

- [ ] **13. Auto-backup + Restore UI**
  - มี endpoint `/api/admin/backup/:teacherCode` แล้วแต่ไม่มี restore + ไม่มี UI auto schedule

- [ ] **14. Tests Phase 4 (Advanced)**
  - Import จาก Aiken format (text)
  - Export ข้อสอบเป็น PDF (สำหรับสอบกระดาษ)
  - Branching questions

- [ ] **15. Re-bind rich menu เมื่อเปลี่ยนแพ็ค**
  - ทำส่วน rebindAllForTeacher() แล้ว แต่ยังไม่ trigger ใน plan change flow
  - ต้องเรียกหลัง upgrade/downgrade สำเร็จ

### ✅ เสร็จแล้ว (สำหรับ context)

- [x] Phase 1 แบบทดสอบ (MCQ + TF + เติมคำ + อัตนัย — auto-grade)
- [x] Excel import คำถาม + template download
- [x] Per-package rich menu auto-bind
- [x] Random teacher code (T-XXXXXX)
- [x] Multi-class test (1 test → หลายห้อง)
- [x] Truant attendance status (ทุกที่ + reports)
- [x] Multi-file homework + links + group submission
- [x] Custom image viewer (PhotoSwipe-like)
- [x] Last page memory (admin/teacher/student)
- [x] Fancy result UI (motivational messages + confetti)
- [x] Time spent fix (UTC parse bug)
- [x] Sidebar layout for student web (responsive)
- [x] Split codebase /student/ vs /student-liff/

---

## Tech Stack

- Runtime: Node.js
- Backend: Express
- Database: SQLite ผ่าน `better-sqlite3`
- Validation: Zod
- Auth: JWT + bcryptjs
- Security middleware: helmet, cors, express-rate-limit
- Frontend: Vanilla HTML/CSS/JavaScript
- Export/Report libraries: `xlsx`, `html2pdf.js`
- File upload: multer
- LINE integration: LINE OA / LIFF / webhook / rich menu

คำสั่งหลัก:

```bash
npm install
npm run init
npm run dev
npm run migrate
npm run smoke
npm start
```

---

## Important Project Structure

```text
src/server.js                         # Express app, middleware, static routes, API mounting
src/config/env.js                     # environment config
src/db/dbCache.js                     # system/teacher DB cache
src/db/initSystem.js                  # initialize system DB
src/db/paths.js                       # storage path helpers
src/db/schemaSystem.js                # system DB schema seed
src/db/schemaTeacher.js               # teacher DB schema seed
src/db/migrations/*                   # migrations
src/middlewares/auth.js               # JWT role guard
src/middlewares/teacherDb.js          # attach teacher SQLite wallet
src/middlewares/moduleGuard.js        # package/module feature guard
src/middlewares/validate.js           # Zod validation middleware
src/routes/auth.routes.js             # login/signup/student binding
src/routes/admin.routes.js            # admin dashboard, teachers, packages, LINE admin
src/routes/teacher.routes.js          # teacher dashboard/classes/students/attendance/homework/reports
src/routes/student.routes.js          # student dashboard/profile/attendance/homework/QR
src/routes/line.routes.js             # LINE config/link/webhook
src/routes/notification.routes.js     # notifications + SSE
src/services/lineService.js           # LINE service
src/services/notificationService.js   # notification service
src/services/walletService.js         # teacher wallet/storage creation
public/admin/*                        # admin web app
public/teacher/*                      # teacher web app
public/student/*                      # student web app
public/liff/*                         # LIFF web app
public/shared/notifications.js        # shared notification client
storage/system.sqlite                 # system database
storage/teachers/*/database.sqlite    # teacher databases
scripts/smoke.js                      # smoke test script
```

---

## User Roles

ระบบมีบทบาทหลัก:

1. **Admin**
   - จัดการครู
   - อนุมัติ/ระงับ/ต่ออายุครู
   - จัดการ package และ module
   - จัดการ LINE rich menu / broadcast

2. **Teacher**
   - จัดการห้องเรียน
   - จัดการนักเรียน
   - จัดการรายวิชา
   - สร้างรอบเช็คชื่อ
   - บันทึกสถานะเช็คชื่อ
   - ดูรายงาน
   - จัดการคะแนนและการบ้านตาม module

3. **Student**
   - ดู dashboard ของตัวเอง
   - ดูประวัติการเข้าเรียน
   - เช็คชื่อด้วย QR ถ้าเปิด module
   - ดู/ส่งการบ้าน ถ้าเปิด module
   - ผูก LINE ถ้าใช้งาน LINE addon

---

## Database Architecture

### System Database

ไฟล์หลัก: `storage/system.sqlite`

Schema หลักอยู่ที่:

```text
src/db/schemaSystem.js
src/db/migrations/system.js
```

ตารางสำคัญ:
- `users`
- `packages`
- `package_modules`
- `subscriptions`
- `payments`

กฎสำคัญ:
- Admin และ teacher อยู่ใน `users`
- Teacher ต้องมี `db_path` และ `storage_path`
- Package เป็นตัวกำหนด module ที่เปิดให้ครูใช้
- ห้ามแก้ `users.db_path` หรือ `storage_path` แบบสุ่ม เพราะกระทบกระเป๋าครู

### Teacher Database

ไฟล์หลัก: `storage/teachers/<teacher-code>/database.sqlite`

Schema หลักอยู่ที่:

```text
src/db/schemaTeacher.js
src/db/migrations/teacher.js
```

ตารางสำคัญ:
- `settings`
- `modules`
- `classes`
- `students`
- `subjects`
- `teaching_assignments`
- `attendance_sessions`
- `attendance_records`
- `attendance_attachments`
- `score_categories`
- `scores`
- `homeworks`
- `homework_submissions`

กฎสำคัญ:
- API ฝั่งครูต้องใช้ `req.teacherDb` จาก `attachTeacherDb`
- ห้ามใช้ system DB ไป query ข้อมูลนักเรียน/เช็คชื่อของครูโดยตรง
- ห้ามรวมข้อมูลข้ามครู ถ้าไม่ได้ออกแบบ migration/permission ชัดเจน

---

## Core Business Logic

### Attendance Types

ระบบรองรับชนิดการเช็คชื่อ:

```text
flag_ceremony      = เช็คเสาธง
homeroom           = เช็คโฮมรูม
subject            = เช็คชื่อรายวิชา แบบ alias เก่า/หน้า UI บางจุด
subject_attendance = เช็คชื่อรายวิชา
activity           = กิจกรรม / ใช้ในบาง flow
```

ใน backend มี mapping สำคัญใน `src/routes/teacher.routes.js`:

```js
const moduleMap = { flag_ceremony: 'flag_ceremony', homeroom: 'homeroom', subject: 'subject_attendance' };
```

### Attendance Statuses

มาตรฐานสถานะที่ใช้จริงในโปรเจกต์:

```text
present   = มา
absent    = ขาด
late      = สาย
leave     = ลา
activity  = กิจกรรม
unchecked = ยังไม่เช็ค
```

Zod validation อยู่ใน `src/validation/teacher.schema.js`

ข้อควรระวัง:
- `unchecked` เป็นค่า default ของ `attendance_records`
- บาง endpoint เช่น bulk mark ไม่รับ `unchecked`
- UI teacher/liff/student มี label ภาษาไทยของสถานะเหล่านี้อยู่แล้ว
- อย่าเปลี่ยนชื่อ status โดยไม่แก้ทั้ง backend, validation, teacher UI, liff UI, student UI และ reports

### Attendance Session Flow

Flow สำคัญ:
1. ครูสร้าง session ที่ `/api/teacher/attendance/session`
2. ระบบสร้าง `attendance_sessions`
3. ระบบ insert `attendance_records` ให้เด็กในห้องทุกคนเป็น `unchecked`
4. ครูแก้ records ผ่าน `/api/teacher/attendance/session/:sessionId/records`
5. รายงานดึงจาก session + records

กฎสำคัญ:
- 1 session มีหลาย records
- 1 record ผูกกับ `session_id` และ `student_id`
- อย่าลบ records แล้วสร้างใหม่ถ้าไม่จำเป็น เพราะจะกระทบประวัติ
- ถ้าต้อง deduplicate ให้ตรวจโครงสร้างเดิมก่อน

---

## Modules / Package Feature Flags

Module ที่พบในโปรเจกต์:

```text
flag_ceremony       = เช็คเสาธง
homeroom            = เช็คโฮมรูม
subject_attendance  = เช็คชื่อรายวิชา
reports             = รายงาน
scores              = คะแนน
homework            = การบ้าน
student_portal      = นักเรียนเข้าใช้งาน
qr_checkin          = เช็คชื่อด้วย QR
line_addon          = แจ้งเตือนผ่าน LINE OA
parent_portal       = ระบบผู้ปกครอง
tests               = แบบทดสอบ
```

> หมายเหตุ: อย่าเพิ่ม module ใหม่แบบ hardcode จุดเดียว ต้องตรวจทั้ง system package seed, teacher modules, admin UI, moduleGuard และ frontend visibility

การป้องกัน feature ใช้:

```text
src/middlewares/moduleGuard.js
requireModule(moduleKey)
```

หาก endpoint เป็น feature เสริม ต้องใส่ `requireModule(...)` ให้ตรง module

---

## API Map Summary

### Auth

Base: `/api/auth`

- `POST /signup`
- `POST /admin/login`
- `POST /teacher/login`
- `POST /student/login`
- `POST /student/line-verify`
- `POST /student/lookup`
- `POST /student/roster`
- `POST /student/line-bind`
- `GET /student/me`
- `POST /student/logout`

### Admin

Base: `/api/admin`

- dashboard
- teachers list/register/approve/suspend/renew
- packages/modules
- backup teacher DB
- LINE teachers/broadcast/rich menus/aliases/default/image/user-link

### Teacher

Base: `/api/teacher`

กลุ่มหลัก:
- dashboard
- modules
- settings schedule
- classes CRUD
- students CRUD/import
- subjects CRUD
- teaching assignments CRUD
- attendance session/records/QR/bulk/date/reports
- homeworks CRUD/copy/submissions/files/grading
- gradebook
- homeroom image upload
- LINE status/unlink/toggle

### Student

Base: `/api/student`

- dashboard
- profile
- modules
- attendance history
- QR check-in
- scores
- homeworks
- homework submit image/file/delete

### LINE

Base: `/api/line`

- config
- verify
- check-link
- link-account
- webhook

### Notifications

Base: `/api/notifications`

- SSE stream
- list
- unread-count
- mark read
- read-all
- delete

---

## Frontend Apps

### Landing

```text
public/landing/index.html
public/landing/app.js
public/landing/styles.css
```

### Admin

```text
public/admin/index.html
public/admin/app.js
public/admin/styles.css
```

ใช้กับ admin dashboard, teachers, packages, LINE management

### Teacher

```text
public/teacher/index.html
public/teacher/app.js
public/teacher/styles.css
```

เป็นไฟล์ใหญ่และเป็นหัวใจของฝั่งครู

ก่อนแก้ frontend ครู ให้ค้นหา function/section ที่เกี่ยวข้องก่อน อย่า rewrite ทั้งไฟล์

### Student

```text
public/student/index.html
public/student/app.js
public/student/styles.css
```

นักเรียนดูข้อมูล เช็คชื่อ QR ส่งงาน

### LIFF

```text
public/liff/index.html
public/liff/app.js
public/liff/styles.css
```

ใช้กับ LINE LIFF และมี flow เช็คชื่อ/การบ้านบางส่วนที่ซ้ำกับ teacher/student

ถ้าแก้ logic ที่เกี่ยวกับ LINE ต้องตรวจ `public/liff/*` ด้วย

---

## Agent Structure for Claude Code

Claude Code ต้องทำงานแบบแบ่งบทบาทต่อไปนี้ แม้จะรันใน session เดียวก็ตาม

### 1. Planner Agent

หน้าที่:
- อ่าน requirement ของผู้ใช้
- อ่านโครงสร้างโปรเจกต์ก่อนแก้
- ระบุไฟล์ที่เกี่ยวข้อง
- แยกว่างานกระทบ backend, frontend, database, LINE, module หรือ deploy
- เสนอแผนก่อนแก้ ถ้างานกระทบหลายส่วน

ห้าม:
- ห้ามแก้ไฟล์ทันทีในงานใหญ่
- ห้ามเดา schema หรือ endpoint ถ้ายังไม่ได้ค้นไฟล์จริง
- ห้ามแก้หลายระบบพร้อมกันโดยไม่แบ่ง phase

### 2. Backend Agent

ดูแล:
- `src/server.js`
- `src/routes/*`
- `src/middlewares/*`
- `src/services/*`
- `src/utils/*`
- `src/validation/*`

กฎ:
- ทุก input สำคัญต้องผ่าน Zod validation ถ้า endpoint นั้นรับข้อมูลจากผู้ใช้
- Endpoint ที่ต้อง login ต้องมี `requireAuth(...)`
- Endpoint ฝั่งครูต้องแน่ใจว่าใช้ `attachTeacherDb`
- Feature เสริมต้องมี `requireModule(...)`
- Response error ควรเป็นภาษาไทย เข้าใจง่าย

### 3. Database Agent

ดูแล:
- `src/db/*`
- `src/db/migrations/*`
- `storage/*` เฉพาะเพื่อ inspect/test ห้ามแก้ข้อมูลจริงมั่ว ๆ

กฎ:
- ถ้าแก้ schema ต้องเขียน migration ที่ปลอดภัย
- ห้าม rename/drop column โดยไม่เช็ค usage ทั้งโปรเจกต์
- ห้ามลบข้อมูลใน `storage` ถ้า user ไม่สั่งชัด
- ต้องระวัง system DB กับ teacher DB คนละบริบท

### 4. Frontend Teacher Agent

ดูแล:
- `public/teacher/*`
- UX สำหรับครู

แนวทาง:
- ครูต้องใช้งานเร็ว คลิกน้อย อ่านง่าย
- ปุ่มเช็คชื่อควรชัด: มา / ขาด / สาย / ลา / กิจกรรม
- รองรับมือถือ/tablet/desktop
- อย่าเปลี่ยน layout ใหญ่ถ้าผู้ใช้ขอแก้เฉพาะจุด
- ถ้าแก้ attendance UI ต้องตรวจการเรียก API และ status mapping ด้วย

### 5. Frontend Student / LIFF Agent

ดูแล:
- `public/student/*`
- `public/liff/*`

กฎ:
- ถ้าแก้ QR check-in ต้องตรวจทั้ง `student.routes.js`, `public/student/app.js`, `public/liff/app.js`
- ข้อความต้องเหมาะกับนักเรียน/ผู้ปกครอง
- ระวัง token/cookie และ LINE binding flow

### 6. Admin / Package Agent

ดูแล:
- `public/admin/*`
- `src/routes/admin.routes.js`
- package/module logic
- teacher approval/suspend/renew

กฎ:
- อย่าแก้ module/package โดยกระทบครูเดิมโดยไม่อธิบาย
- ถ้าเพิ่ม package ต้องดู seed และ migration
- LINE rich menu logic ต้องระวัง API และรูปภาพ upload

### 7. QA / Reviewer Agent

ต้องตรวจหลังแก้:
- server start ได้หรือไม่
- endpoint ที่เกี่ยวข้องยังผ่าน validation
- ไม่มี route หาย
- ไม่มี syntax error ใน JS frontend
- status mapping ตรงกัน backend/frontend
- module guard ไม่ทำให้ผู้ใช้ปกติเข้า feature ไม่ได้แบบผิดพลาด
- ถ้ามีคำสั่ง smoke/test ให้รัน `npm run smoke` หรือคำสั่งที่เหมาะสม

---

## Required Workflow Every Time

ก่อนแก้โค้ดทุกครั้ง:

1. อ่าน `CLAUDE.md`
2. ตรวจไฟล์จริงที่เกี่ยวข้อง ห้ามเดาจากความจำ
3. สรุป scope งาน
4. ระบุไฟล์ที่จะอ่าน/แก้
5. ถ้างานเสี่ยง ให้เสนอแผนและรออนุมัติ
6. แก้เฉพาะไฟล์ที่จำเป็น
7. รัน test/build/smoke เท่าที่ทำได้
8. สรุปผลเป็นภาษาไทย

รูปแบบสรุปหลังทำงาน:

```text
สรุปงานที่ทำ:
- ...

ไฟล์ที่แก้:
- ...

ตรวจแล้ว:
- ...

สิ่งที่ต้องระวัง/แนะนำต่อ:
- ...
```

---

## Coding Rules

- ใช้ CommonJS ตามรูปแบบเดิมของโปรเจกต์ (`require`, `module.exports`)
- รักษา style เดิมของไฟล์ ไม่แปลงเป็น TypeScript/ESM
- ห้ามเพิ่ม dependency ถ้าไม่จำเป็น
- ห้าม rewrite ไฟล์ใหญ่ทั้งไฟล์โดยไม่จำเป็น โดยเฉพาะ `public/teacher/app.js` และ `public/liff/app.js`
- ใช้ภาษาไทยในข้อความ UI/API error ที่ผู้ใช้เห็น
- อย่า hardcode ข้อมูลนักเรียนจริง
- อย่า log token/password/ข้อมูลส่วนตัวนักเรียน
- ถ้าเพิ่ม endpoint ให้เพิ่ม validation schema เมื่อเหมาะสม
- ถ้าแก้ validation ให้ตรวจ frontend payload ที่ส่งมาด้วย
- ถ้าแก้ attendance status ต้องตรวจทุกจุดที่ map status label

---

## Safety Rules

ข้อมูลนักเรียนถือเป็นข้อมูลสำคัญ:

- ห้ามแสดงข้อมูลนักเรียนข้ามครู
- ห้าม bypass auth/permission/module guard
- ห้าม expose `db_path`, token, password hash, หรือ path ภายใน server ให้ frontend โดยไม่จำเป็น
- ห้ามใส่ข้อมูลจริงในตัวอย่างหรือ mock
- Upload ต้องจำกัดชนิดไฟล์และขนาดไฟล์ตาม pattern เดิม
- Export รายงานต้องดึงเฉพาะข้อมูลของครู/ห้องที่เกี่ยวข้อง

---

## UX Rules

ระบบนี้ใช้โดยครูจริง ต้องเน้นเร็วและง่าย:

- ปุ่มใหญ่พอสำหรับมือถือ
- ตารางนักเรียนต้องอ่านง่าย
- แจ้งผลหลังบันทึกชัดเจน
- empty state ต้องเข้าใจง่าย เช่น `ยังไม่มีนักเรียนในห้องนี้`
- error ต้องบอกทางแก้ ไม่ใช่แค่ error ดิบ
- หลีกเลี่ยง flow ที่ต้องคลิกซ้ำเยอะ
- ถ้าเป็นงานเช็คชื่อ ให้ลด friction มากที่สุด

ข้อความแนะนำ:

```text
บันทึกการเช็คชื่อเรียบร้อยแล้ว
ยังไม่มีรายชื่อนักเรียนในห้องนี้
กรุณาเลือกห้องเรียน
กรุณาเลือกวันที่
ไม่สามารถบันทึกได้ กรุณาลองใหม่อีกครั้ง
คุณไม่มีสิทธิ์ใช้งานโมดูลนี้
```

---

## High-Risk Areas

ต้องระวังเป็นพิเศษ:

1. `src/routes/teacher.routes.js`
   - ไฟล์ใหญ่ รวมหลาย feature
   - แก้จุดหนึ่งอาจกระทบ attendance/homework/report

2. `public/teacher/app.js`
   - ไฟล์ frontend ใหญ่
   - มีหลายหน้ารวมกัน
   - ต้องแก้เฉพาะ section ที่เกี่ยวข้อง

3. `public/liff/app.js`
   - เกี่ยวกับ LINE/LIFF
   - อาจมี flow ซ้ำกับ student/teacher

4. `src/db/migrations/*`
   - กระทบข้อมูลจริง
   - ต้องระวัง migration ซ้ำ/ไม่ idempotent

5. `storage/*`
   - เป็นข้อมูลจริง/ตัวอย่างจากระบบ
   - ห้ามลบหรือแก้โดยไม่สั่งชัด

6. `.env` / `.env.example`
   - ห้ามเปิดเผย secret
   - ห้ามเขียน token จริงลงเอกสาร

---

## Quick Commands for Claude Code

ใช้เมื่อต้อง inspect โปรเจกต์:

```bash
find . -maxdepth 3 -type f \
  -not -path './node_modules/*' \
  -not -path './storage/*' \
  -not -path './.git/*'
```

ค้นหา route:

```bash
grep -R "router\." -n src/routes
```

ค้นหา attendance status:

```bash
grep -R "present\|absent\|late\|leave\|unchecked\|activity" -n src public
```

ค้นหา module guard:

```bash
grep -R "requireModule" -n src
```

รันระบบ:

```bash
npm run dev
```

รัน smoke:

```bash
npm run smoke
```

---
## Communication Rules

- Claude Code ต้องตอบผู้ใช้เป็นภาษาไทยเป็นหลัก
- เวลาอธิบายแผน ให้เขียนเป็นภาษาไทยที่เข้าใจง่าย
- เวลาแจ้ง error ให้แปลความหมายเป็นภาษาไทยก่อน แล้วค่อยแนบ error ดิบถ้าจำเป็น
- เวลาเสนอวิธีแก้ ให้เขียนเป็นขั้นตอนสั้น ๆ
- เวลาแก้โค้ดเสร็จ ต้องสรุปเป็นภาษาไทย

รูปแบบสรุปหลังทำงานเสร็จ:

สรุปงานที่ทำ:
- ...

ไฟล์ที่แก้:
- ...

ทดสอบแล้ว:
- ...

สิ่งที่ต้องระวัง:
- ...


## Current MCP / Skills Awareness

<!-- cloude-code-toolbox:mcp-skills-awareness-begin -->

### MCP & Skills awareness (Cloude Code ToolBox)

_Last synced: 2026-04-29T15:01:03.513Z._

- **Full report:** `.claude/cloude-code-toolbox-mcp-skills-awareness.md` in this workspace (auto-overwritten on each scan). Use it as ground truth for configured servers and skill folders.
- **MCP:** For **live tools** in Claude Code, enable the matching server via `/mcp` (and VS Code `mcp.json` where applicable).
- **When the user’s task matches a server** (e.g. Confluence work and a **Confluence** / **Atlassian** MCP is listed), **prefer that server id** and plan on tool use—not only file search.
- **Skills:** Folders below contain `SKILL.md`; attach or cite paths in chat when relevant.

#### Workspace MCP

- `/Volumes/Macintosh HD - Data/SAKOOL_CHk/.vscode/mcp.json` _(workspace: SAKOOL_CHk)_ — _file missing_

_No active workspace servers in mcp.json._

#### User MCP

- `/Users/wormac/Library/Application Support/Code/User/mcp.json` — _file missing_

_No active user-scoped servers in mcp.json._

#### Project skills

_None found (or no workspace open)._

#### User skills

_None found._

<!-- cloude-code-toolbox:mcp-skills-awareness-end -->
