CLAUDE.md
Ghi chú cho Claude Code khi làm việc trong repo này.
Tài liệu tham khảo trước
- Kiến trúc tổng quan:
docs/ARCHITECTURE.md,docs/requirements/06-SYSTEM-DESIGN.md - Coding convention / pattern chi tiết (naming, service/controller pattern,
Kafka, migration...):
.cursor/skills/my-rule/SKILL.md - Quyết định kỹ thuật đã có ("tại sao lại làm thế này"):
docs/adr/ - Hướng dẫn dev/local đầy đủ:
docs/DEVELOPMENT.md
Kiến trúc tổng quan (quick facts)
NX monorepo, yarn. 6 service NestJS + 1 service Python. Chi tiết đầy đủ xem
docs/ARCHITECTURE.md.
| App | Port | Stack |
|---|---|---|
apps/api-gateway |
3000 | NestJS, REST proxy + GraphQL (Apollo, DataLoader), WebSocket (Socket.IO) |
apps/user-service |
3001 | NestJS, TypeORM/Postgres |
apps/field-service |
3002 | NestJS, TypeORM/Postgres |
apps/booking-service |
3003 | NestJS, TypeORM/Postgres, Redis lock |
apps/payment-service |
3004 | NestJS, TypeORM/Postgres, Stripe |
apps/notification-service |
3005 | NestJS, Kafka consumer, email (nodemailer) |
apps/openclaw |
— | Python/FastAPI — ops/monitoring Telegram bot, stack riêng biệt, không theo convention NestJS bên dưới |
Cross-cutting: libs/{shared,database,messaging,cache,observability,config,testing}.
Giao tiếp: sync = api-gateway proxy HTTP; async = Kafka (topics tại
libs/shared/src/constants/kafka-topics.ts) + BullMQ (job queue nội bộ, xem
ADR-0006); auth = Keycloak/JWT (ADR-0005); observability = OpenTelemetry +
SigNoz (ADR-0004).
Lưu ý: repo tên có "-k3s" nhưng không chứa k8s/helm manifest local — deploy
production qua GitOps repo riêng (footballbookingteam100/football-booking-gitops),
xem .github/workflows/cd.yml. Dev/local dùng docker-compose.
Lệnh thường dùng
yarn dev # chạy tất cả service song song
yarn dev:gateway # chạy 1 service (đổi tên theo app)
yarn test # unit test (nx test)
yarn test:integration # integration test (testcontainers, cần Docker)
yarn test:e2e:booking # e2e theo flow (xem test/e2e/flows/)
yarn check:all # format:check + lint + typecheck — chạy trước khi commit
Chi tiết đầy đủ (env setup, docker infra, migration...) xem
docs/DEVELOPMENT.md.
Claude Code Subagents
Repo có sẵn các subagent chuyên biệt trong .claude/agents/ — ưu tiên
delegate sang subagent phù hợp thay vì tự làm hết trong main session, để
tránh lẫn context giữa các domain khác nhau:
| Subagent | Dùng khi |
|---|---|
nestjs-service-dev |
Implement/sửa feature trong 6 service NestJS hoặc libs/ (endpoint, entity, DTO, Kafka producer/consumer, GraphQL resolver...) |
openclaw-ops-bot-dev |
Sửa apps/openclaw (Python/FastAPI ops bot) — stack và convention khác hẳn NestJS |
adr-writer |
Trước khi thêm dependency/tech mới, đổi kiến trúc giữa service, hoặc quyết định khó đảo ngược — xem policy ở mục ADR bên dưới |
security-reviewer |
Review bảo mật read-only trước khi merge thay đổi nhạy cảm (auth, payment, webhook) — OWASP, secrets, đối chiếu Semgrep/Trivy |
test-debugger |
Debug test fail (unit/integration/contract/e2e/k6) — reproduce, isolate root cause, fix tối thiểu |
observability-engineer |
Sửa OpenTelemetry instrumentation, SigNoz dashboard/alert, hoặc cần tra cứu nhanh trong đống doc OBSERVABILITY-*/SIGNOZ-* |
Architecture Decision Records (ADR)
Repo dùng docs/adr/ làm nhật ký các quyết định kỹ thuật — mục đích để sau
này nhìn lại được hành trình và lý do đằng sau mỗi lựa chọn, không chỉ code
diff. Khi thực hiện một trong các việc sau, PHẢI tạo hoặc cập nhật một ADR
trong docs/adr/ (dùng docs/adr/template.md) trước khi implement —
không chỉ tóm tắt trong PR description hay báo cáo cuối task:
- Thêm một dependency/công nghệ mới ở tầng service hoặc infra (DB, message queue, observability tool, API style, identity provider...)
- Đổi kiến trúc giữa các service (giao tiếp sync/async, thêm gateway pattern, đổi cách chia sẻ dữ liệu...)
- Có từ 2 phương án kỹ thuật khả thi trở lên và phải chọn 1 (framework, thư viện, cách tổ chức module...)
- Một quyết định khó đảo ngược (schema, giao thức, vendor lock-in, thay đổi ảnh hưởng nhiều service)
Không cần ADR cho: bug fix, refactor nội bộ 1 file/module, thay đổi UI/copy, thêm field/endpoint theo pattern đã có sẵn.
Quy tắc khi viết ADR:
- Đánh số file tuần tự
NNNN-slug-khong-dau.md, tiếp theo số lớn nhất đang có trongdocs/adr/(xem bảng trongdocs/adr/README.md). - Không sửa lại ADR đã Accepted khi quyết định thay đổi sau này — tạo
ADR mới, set
Supersedesở ADR mới vàSuperseded byở ADR cũ, đổi status ADR cũ thànhSuperseded. - Nội dung ngắn gọn theo template: Bối cảnh → Quyết định → Lựa chọn khác đã cân nhắc → Hệ quả → Liên kết. Không viết dài dòng như blog post.
- Sau khi tạo/sửa ADR, cập nhật bảng danh sách trong
docs/adr/README.md(số, tiêu đề, status, ngày). - Nếu không chắc một thay đổi có "đáng" ADR hay không, hỏi lại người dùng thay vì tự quyết định bỏ qua.