@dtd-dev/agent-kb 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +105 -0
  2. package/bin/cli.js +653 -0
  3. package/package.json +33 -0
  4. package/template/AGENTS.md +34 -0
  5. package/template/CLAUDE.md +4 -0
  6. package/template/GEMINI.md +6 -0
  7. package/template/_adr-skeleton.md +8 -0
  8. package/template/_agent-skeleton.md +21 -0
  9. package/template/_feature-skeleton/api.md +8 -0
  10. package/template/_feature-skeleton/design.md +6 -0
  11. package/template/_feature-skeleton/requirements.md +9 -0
  12. package/template/_feature-skeleton/test-cases.md +7 -0
  13. package/template/_skill-skeleton.md +16 -0
  14. package/template/_stacks/go.md +19 -0
  15. package/template/_stacks/java.md +19 -0
  16. package/template/_stacks/node.md +19 -0
  17. package/template/_stacks/php.md +18 -0
  18. package/template/_stacks/python.md +19 -0
  19. package/template/_stacks/react.md +20 -0
  20. package/template/_stacks/rust.md +18 -0
  21. package/template/ai/README.md +28 -0
  22. package/template/ai/agents/bug-fixer.md +23 -0
  23. package/template/ai/agents/feature-builder.md +18 -0
  24. package/template/ai/agents/reviewer.md +20 -0
  25. package/template/ai/agents/tester.md +21 -0
  26. package/template/ai/architecture.md +40 -0
  27. package/template/ai/core/coding-standards.md +28 -0
  28. package/template/ai/core/glossary.md +20 -0
  29. package/template/ai/core/tech-stack.md +19 -0
  30. package/template/ai/decisions/ADR-001-auth.md +9 -0
  31. package/template/ai/decisions/ADR-002-cache.md +9 -0
  32. package/template/ai/decisions/ADR-003-logging.md +9 -0
  33. package/template/ai/examples/api-example.md +31 -0
  34. package/template/ai/examples/coding-example.md +28 -0
  35. package/template/ai/examples/testing-example.md +32 -0
  36. package/template/ai/memory/common-bugs.md +11 -0
  37. package/template/ai/memory/lessons-learned.md +6 -0
  38. package/template/ai/memory/troubleshooting.md +19 -0
  39. package/template/ai/product/business-rules.md +19 -0
  40. package/template/ai/product/domain-model.md +22 -0
  41. package/template/ai/product/vision.md +8 -0
  42. package/template/ai/skills/backend/carepay-oncall-gen2.md +24 -0
  43. package/template/ai/skills/backend/carepay-request-gen2.md +23 -0
  44. package/template/ai/skills/backend/carepay-trigger-gen2.md +24 -0
  45. package/template/ai/skills/devops/deployment.md +29 -0
  46. package/template/ai/skills/devops/docker.md +24 -0
  47. package/template/ai/skills/devops/github-actions.md +26 -0
  48. package/template/ai/skills/frontend/carepay-firebase.md +25 -0
  49. package/template/ai/skills/frontend/react.md +24 -0
  50. package/template/ai/skills/frontend/ui-guideline.md +29 -0
  51. package/template/ai/specs/feature-a/api.md +26 -0
  52. package/template/ai/specs/feature-a/design.md +12 -0
  53. package/template/ai/specs/feature-a/requirements.md +13 -0
  54. package/template/ai/specs/feature-a/test-cases.md +12 -0
  55. package/template/ai/workflows/code-review.md +25 -0
  56. package/template/ai/workflows/create-feature.md +37 -0
  57. package/template/ai/workflows/fix-bug.md +16 -0
  58. package/template/ai/workflows/incident-response.md +19 -0
  59. package/template/ai/workflows/learn.md +24 -0
  60. package/template/ai/workflows/release.md +23 -0
  61. package/template/github/copilot-instructions.md +5 -0
  62. package/template/tools/pointer.md +5 -0
@@ -0,0 +1,32 @@
1
+ <!-- Mục đích: mẫu viết test chuẩn. -->
2
+ # Testing Example
3
+
4
+ > Mẫu theo **Vitest/Jest** (cú pháp tương đương). Đổi sang test runner thật của dự án nếu khác.
5
+
6
+ Tên test mô tả **hành vi** · cấu trúc **arrange–act–assert** · phủ happy path + ca lỗi.
7
+
8
+ ```ts
9
+ import { describe, it, expect } from "vitest";
10
+ import { withdraw, InsufficientBalanceError } from "../coding-example";
11
+
12
+ describe("withdraw", () => {
13
+ it("trừ đúng số tiền khi đủ số dư", () => {
14
+ // arrange
15
+ const account = { id: "a1", balance: 100 };
16
+ // act
17
+ const balance = withdraw(account, 30);
18
+ // assert
19
+ expect(balance).toBe(70);
20
+ });
21
+
22
+ it("ném InsufficientBalanceError khi rút quá số dư", () => {
23
+ const account = { id: "a1", balance: 20 };
24
+ expect(() => withdraw(account, 50)).toThrow(InsufficientBalanceError);
25
+ });
26
+
27
+ it("từ chối số tiền dưới mức tối thiểu", () => {
28
+ const account = { id: "a1", balance: 100 };
29
+ expect(() => withdraw(account, 0)).toThrow(RangeError);
30
+ });
31
+ });
32
+ ```
@@ -0,0 +1,11 @@
1
+ <!-- Mục đích: bug hay tái diễn + cách xử nhanh. -->
2
+ <!-- Các dòng dưới là MẪU (CarePay/Firebase). Thay/append theo bug thật của dự án bạn. -->
3
+ # Common Bugs
4
+ | Triệu chứng | Nguyên nhân gốc | Cách xử |
5
+ |---|---|---|
6
+ | Bị tính tiền 2 lần khi mạng chập | Client retry mà thiếu idempotency key | Bắt buộc `idempotencyKey`, "tạo nếu chưa có" trong transaction (BR-002) |
7
+ | Số dư cộng đôi | Webhook gateway gửi lại, trigger chạy 2 lần | No-op nếu trạng thái đã ở đích; khớp theo `gatewayRef` (BR-003) |
8
+ | Sai số tiền lẻ (lệch 1đ) | Dùng float cho tiền | Lưu/ tính bằng số nguyên (đồng); dồn dư vào kỳ trả góp cuối (BR-006) |
9
+ | Query Firestore lỗi "needs an index" | Thiếu composite index cho where + orderBy | Thêm vào `firestore.indexes.json` rồi deploy |
10
+ | `context.auth` undefined trong onCall | Client gọi khi chưa đăng nhập / token hết hạn | Chặn sớm, trả `UNAUTHENTICATED`; client refresh token |
11
+ | Đổi role nhưng quyền không đổi | Custom claim cũ còn trong token | Gọi `getIdToken(true)` để lấy token mới sau khi set claim |
@@ -0,0 +1,6 @@
1
+ <!-- Mục đích: bài học tích luỹ. Append dần, đừng viết trước. -->
2
+ <!-- Mục dưới là MẪU minh hoạ định dạng. Xoá khi bắt đầu ghi bài học thật. -->
3
+ # Lessons Learned
4
+ > Mỗi mục: chuyện gì xảy ra → học được gì → đổi cách làm thế nào.
5
+
6
+ - 2024-03-10: Một đợt retry của đối tác làm double-charge vài giao dịch → idempotency phải áp dụng từ đầu cho MỌI mutation tiền bạc, không chỉ webhook → thêm `idempotencyKey` bắt buộc + kiểm tra trong code-review (BR-002, ADR-002).
@@ -0,0 +1,19 @@
1
+ <!-- Mục đích: cẩm nang gỡ rối theo tình huống. -->
2
+ <!-- Các mục dưới là MẪU (CarePay/Firebase). Thay/append theo sự cố thật của dự án bạn. -->
3
+ # Troubleshooting
4
+
5
+ ## Cloud Function trả 401/403 dù đã đăng nhập
6
+ - Kiểm tra: client có đính ID token chưa; token hết hạn (refresh chưa); vừa đổi custom claim mà chưa `getIdToken(true)`.
7
+ - Khắc phục: ép refresh token sau khi đổi claim; xác nhận `onCall` đọc `context.auth`, `onRequest` verify token qua Admin SDK.
8
+
9
+ ## Số dư Wallet sai sau thanh toán
10
+ - Kiểm tra: trigger cập nhật số dư có chạy 2 lần không (webhook trùng); có bọc trong transaction không; có dùng số nguyên (đồng) không.
11
+ - Khắc phục: bảo đảm idempotency theo `gatewayRef`/BR-002; đối chiếu `transactions` (append-only) để truy bút toán lệch.
12
+
13
+ ## Webhook gateway báo thành công nhưng Payment vẫn `pending`
14
+ - Kiểm tra: chữ ký webhook có verify đúng không (sai → bị bỏ); URL webhook đúng môi trường chưa; log có `correlationId` của giao dịch không.
15
+ - Khắc phục: tra Cloud Logging theo `paymentId`; nếu thứ tự đảo (webhook đến trước khi ghi `pending`), khớp theo `gatewayRef` rồi cập nhật.
16
+
17
+ ## Triệu chứng chỉ xảy ra trên production, không thấy ở local
18
+ - Kiểm tra: đang dùng Firebase Emulator hay project thật; biến môi trường/secret giữa các môi trường; index Firestore đã deploy chưa.
19
+ - Khắc phục: tái hiện bằng emulator với dữ liệu giống prod; so cấu hình theo `skills/devops/deployment.md`.
@@ -0,0 +1,19 @@
1
+ <!-- Mục đích: ràng buộc nghiệp vụ. Load khi code logic nghiệp vụ. -->
2
+ <!-- Nội dung dưới là MẪU (CarePay). Thay bằng rule thật của dự án bạn, giữ cách đánh số. -->
3
+ # Business Rules
4
+
5
+ > Mỗi rule đánh số để code/test tham chiếu được (vd: BR-001).
6
+
7
+ - **BR-001 — Số tiền hợp lệ**: `amount` phải là số nguyên `> 0` và `<=` hạn mức mỗi giao dịch (mặc định 50.000.000đ). Sai → từ chối với `VALIDATION_ERROR`.
8
+ - **BR-002 — Idempotency**: mỗi `createPayment` kèm `idempotencyKey` duy nhất; gọi lại cùng key trả về Payment đã tạo, KHÔNG tạo bản mới (chống double-charge khi retry/mạng chập).
9
+ - **BR-003 — Trạng thái một chiều**: Payment chỉ đi `pending → succeeded | failed`; `succeeded → refunded`. Mọi chuyển trạng thái khác bị cấm.
10
+ - **BR-004 — Số dư không âm**: thao tác làm `wallet.balance < 0` bị từ chối (`INSUFFICIENT_BALANCE`).
11
+ - **BR-005 — Quyền sở hữu**: User chỉ đọc/thao tác Payment & Wallet của chính mình (enforce ở Security Rules + ở function).
12
+ - **BR-006 — Trả góp**: tổng các Installment phải đúng bằng `amount` của Payment; số kỳ trong khoảng cho phép (vd 3–12).
13
+ - **BR-007 — Hoàn tiền**: chỉ hoàn được Payment `succeeded`, trong cửa sổ cho phép; tạo Transaction đối ứng, không sửa Payment gốc.
14
+
15
+ ## Edge cases
16
+ - Webhook gateway đến **trước** khi ghi `pending` xong → trigger phải chịu được thứ tự đảo (dùng `gatewayRef` để khớp).
17
+ - Webhook **trùng** (gateway gửi lại) → bỏ qua nếu trạng thái đã ở đích (BR-002/BR-003).
18
+ - User bị `status = disabled` giữa lúc thanh toán → từ chối trước khi gọi gateway.
19
+ - Tiền lẻ khi chia trả góp → dồn phần dư vào kỳ cuối để tổng khớp (BR-006).
@@ -0,0 +1,22 @@
1
+ <!-- Mục đích: thực thể nghiệp vụ và quan hệ. Load khi thiết kế data/model. -->
2
+ <!-- Nội dung dưới là MẪU (CarePay, Firestore). Thay bằng domain thật của dự án bạn. -->
3
+ # Domain Model
4
+
5
+ ## Entities
6
+ - **User** (`users/{uid}`): người dùng đã đăng nhập (Firebase Auth). Thuộc tính: `displayName`, `phone`, `status`, `createdAt`. Một User có một Wallet.
7
+ - **Wallet** (`wallets/{uid}`): số dư & trạng thái của User. `balance` (đơn vị: đồng, số nguyên), `currency`, `updatedAt`. Chỉ Cloud Functions được ghi.
8
+ - **Provider** (`providers/{id}`): cơ sở y tế nhận tiền. `name`, `taxCode`, `payoutAccount`, `status`.
9
+ - **Payment** (`payments/{id}`): một lần thanh toán. `userId`, `providerId`, `amount`, `status` (`pending|succeeded|failed|refunded`), `gatewayRef`, `idempotencyKey`, `createdAt`. Bất biến sau khi `succeeded` (chỉ chuyển sang `refunded`).
10
+ - **Installment** (`payments/{id}/installments/{n}`): kỳ trả góp của một Payment. `seq`, `dueDate`, `amount`, `status`.
11
+ - **Transaction** (`wallets/{uid}/transactions/{id}`): bút toán thay đổi số dư (audit log) — `type`, `amount`, `paymentId`, `balanceAfter`.
12
+
13
+ ## Quan hệ
14
+ - User **1—1** Wallet.
15
+ - User **1—n** Payment; Provider **1—n** Payment.
16
+ - Payment **1—n** Installment (nếu trả góp).
17
+ - Wallet **1—n** Transaction (mỗi thay đổi số dư = 1 bút toán, không sửa/xoá).
18
+
19
+ ## Quy ước dữ liệu
20
+ - Tiền lưu bằng **số nguyên đơn vị nhỏ nhất** (đồng) — không dùng float.
21
+ - Mọi document có `createdAt`/`updatedAt` (server timestamp).
22
+ - Thay đổi số dư đi qua Transaction (append-only) để đối soát được.
@@ -0,0 +1,8 @@
1
+ <!-- Mục đích: tầm nhìn sản phẩm. Hiếm cần khi code — chỉ load khi bàn hướng đi. -->
2
+ <!-- Nội dung dưới là MẪU (CarePay). Thay bằng tầm nhìn thật của dự án bạn. -->
3
+ # Product Vision
4
+ - **Vấn đề giải quyết**: viện phí lớn, trả một lần gây áp lực tài chính; cơ sở y tế tốn công thu và đối soát thủ công.
5
+ - **Người dùng mục tiêu**: bệnh nhân cần linh hoạt thanh toán (gồm trả góp); cơ sở y tế (Provider) muốn nhận tiền nhanh, đối soát tự động.
6
+ - **Giá trị cốt lõi**: thanh toán viện phí an toàn, minh bạch, hỗ trợ trả góp; trải nghiệm vài chạm; đối soát tự động cho Provider.
7
+ - **Không làm (out of scope)**: không phải ví điện tử đa năng; không cho vay tiêu dùng ngoài y tế; không lưu thông tin thẻ thô (uỷ thác cho gateway).
8
+ - **Chỉ số thành công**: tỷ lệ thanh toán thành công, thời gian hoàn tất, tỷ lệ giao dịch lỗi/hoàn tiền.
@@ -0,0 +1,24 @@
1
+ <!-- Mục đích: quy trình on-call backend CarePay Gen2. Load khi task thuộc loại này. -->
2
+ <!-- Nội dung dưới là MẪU minh hoạ pattern onCall. Sửa theo code thật của dự án bạn. -->
3
+ # Skill: CarePay On-call (Gen2)
4
+
5
+ ## Khi nào dùng
6
+ Viết/sửa **callable function** (`onCall`) Gen2 — thao tác gọi từ app đã đăng nhập (vd `createPayment`, `getWallet`).
7
+
8
+ ## Quy tắc / pattern
9
+ - **Xác thực trước tiên**: đọc `request.auth`; chưa có → ném `HttpsError("unauthenticated", ...)`. Phân quyền theo `uid`/custom claim (ADR-001).
10
+ - **Validate input ở biên** trước khi chạm dữ liệu (BR-001); trả `HttpsError("invalid-argument", ...)` với `code` rõ.
11
+ - **Mutation tiền bạc phải idempotent + transaction** (BR-002, ADR-002): "tạo nếu chưa có" theo `idempotencyKey`.
12
+ - **Trả dữ liệu tối thiểu** client cần; KHÔNG trả nội bộ/PII thừa. Lỗi dùng `HttpsError` với code máy đọc.
13
+ - **Side-effect để cho trigger lo** (cập nhật số dư, gửi mail) — onCall chỉ tạo sự thay đổi nguồn.
14
+ - **Cấu hình** vùng/secret qua env (Gen2: `defineSecret`/`defineString`), không hardcode.
15
+ - **Log có `correlationId`** (= `paymentId`/request id), không log token/PII (ADR-003).
16
+
17
+ ## Cạm bẫy thường gặp
18
+ - Quên verify `request.auth` → ai cũng gọi được; rò rỉ dữ liệu.
19
+ - Đọc-rồi-ghi ngoài transaction → race condition double-charge.
20
+ - Ném Error thường thay vì `HttpsError` → client nhận `internal` mất thông tin.
21
+
22
+ ## Tham chiếu
23
+ - `decisions/ADR-001-auth.md`, `decisions/ADR-002-cache.md`
24
+ - `specs/feature-a/` (ví dụ `createPayment`) · `core/coding-standards.md`
@@ -0,0 +1,23 @@
1
+ <!-- Mục đích: xử lý request backend CarePay Gen2. Load khi task thuộc loại này. -->
2
+ <!-- Nội dung dưới là MẪU minh hoạ pattern onRequest. Sửa theo code thật của dự án bạn. -->
3
+ # Skill: CarePay Request (Gen2)
4
+
5
+ ## Khi nào dùng
6
+ Viết/sửa **HTTP function** (`onRequest`) Gen2 — endpoint cho đối tác ngoài / webhook (vd `paymentWebhook`), nơi không có Firebase Auth token.
7
+
8
+ ## Quy tắc / pattern
9
+ - **Tự xác thực**: không có `request.auth` → phải **verify chữ ký** webhook (HMAC/secret từ env) hoặc verify ID token thủ công qua Admin SDK. Sai → `401/400`, dừng ngay.
10
+ - **Idempotent theo khoá ngoài** (`gatewayRef`): xử lý lại cùng sự kiện = no-op (BR-002, BR-003). Trả `200` cả khi no-op để gateway ngừng retry.
11
+ - **Chỉ chuyển trạng thái hợp lệ** (BR-003); chịu được **thứ tự đảo** (webhook đến trước khi ghi `pending`) bằng cách khớp theo `gatewayRef`.
12
+ - **Validate payload** & method; trả HTTP status đúng ngữ nghĩa; body lỗi có `code`.
13
+ - **Đáp nhanh, đẩy việc nặng cho trigger/Pub/Sub**: webhook nên ngắn, tránh timeout của gateway.
14
+ - **Log `correlationId`**, không echo payload nhạy cảm (ADR-003).
15
+
16
+ ## Cạm bẫy thường gặp
17
+ - Bỏ qua verify chữ ký → ai cũng giả webhook để đổi trạng thái thanh toán.
18
+ - Trả `5xx` khi gặp sự kiện trùng → gateway retry vô hạn (nên no-op `200`).
19
+ - Xử lý đồng bộ quá lâu trong webhook → timeout, gateway coi là thất bại.
20
+
21
+ ## Tham chiếu
22
+ - `decisions/ADR-002-cache.md`, `decisions/ADR-003-logging.md`
23
+ - `specs/feature-a/api.md` (webhook) · `architecture.md`
@@ -0,0 +1,24 @@
1
+ <!-- Mục đích: cách viết/sửa trigger backend CarePay Gen2. Load khi task thuộc loại này. -->
2
+ <!-- Nội dung dưới là MẪU minh hoạ pattern trigger. Sửa theo code thật của dự án bạn. -->
3
+ # Skill: CarePay Trigger (Gen2)
4
+
5
+ ## Khi nào dùng
6
+ Viết/sửa **event-triggered function** Gen2 — chạy theo sự kiện Firestore/Auth/Pub/Sub để xử lý **hệ quả phụ** (vd `onPaymentSucceeded` cập nhật ví, gửi thông báo).
7
+
8
+ ## Quy tắc / pattern
9
+ - **Idempotent** là bắt buộc: trigger **có thể chạy nhiều lần** cho cùng sự kiện. Dùng `event.id`/cờ trạng thái để no-op nếu đã xử lý (BR-002).
10
+ - **Mutation số dư trong transaction**, ghi `transactions` (append-only) thay vì sửa số tại chỗ — để đối soát (domain-model).
11
+ - **Bảo vệ vòng lặp**: nếu trigger ghi lại chính collection nó lắng nghe, phải có điều kiện thoát để không kích hoạt đệ quy vô hạn.
12
+ - **Chỉ phản ứng đúng chuyển trạng thái** (so `before`/`after`, BR-003): vd chỉ xử khi `pending → succeeded`.
13
+ - **Lỗi & retry**: trigger sẽ được retry khi ném lỗi — đảm bảo retry an toàn; phần "không nên retry" thì nuốt có chủ đích + log.
14
+ - **Không nhận input từ client**: nguồn sự thật là document, không phải tham số người dùng.
15
+ - **Log `correlationId`** = `paymentId` (ADR-003).
16
+
17
+ ## Cạm bẫy thường gặp
18
+ - Cộng số dư không idempotent → cộng đôi khi trigger chạy lại.
19
+ - Trigger tự ghi lại document đang nghe → loop vô hạn, đốt chi phí.
20
+ - Giả định chạy đúng 1 lần / đúng thứ tự — Gen2 không đảm bảo điều đó.
21
+
22
+ ## Tham chiếu
23
+ - `decisions/ADR-002-cache.md` · `product/domain-model.md` · `product/business-rules.md`
24
+ - `specs/feature-a/design.md` (`onPaymentSucceeded`)
@@ -0,0 +1,29 @@
1
+ <!-- Mục đích: quy trình deploy lên môi trường. Load khi task thuộc loại này. -->
2
+ # Skill: Deployment
3
+
4
+ ## Khi nào dùng
5
+ Đưa code lên môi trường (staging/production), cấu hình release, rollback.
6
+
7
+ ## Quy tắc / pattern
8
+ - **Promote qua môi trường**: dev → staging → production. Cùng một artifact đã test, không build lại cho từng môi trường.
9
+ - **Config tách khỏi code**: khác biệt giữa môi trường nằm ở ENV/secret manager, không sửa code khi deploy.
10
+ - **Chiến lược zero-downtime**: rolling update hoặc blue/green; có health check trước khi nhận traffic.
11
+ - **Migration trước, tương thích ngược**: chạy migration DB trước khi deploy app; schema phải tương thích cả version cũ lẫn mới (expand → migrate → contract).
12
+ - **Smoke test sau deploy**: kiểm tra nhanh các luồng chính trên môi trường vừa deploy.
13
+ - **Rollback sẵn sàng**: biết cách quay về version trước trong vài phút (giữ artifact cũ / feature flag).
14
+ - **Observability**: theo dõi error rate, latency, log ngay sau khi deploy.
15
+
16
+ <!-- Điền lệnh/hạ tầng thật của dự án (vd: kubectl, terraform, script deploy, registry): -->
17
+ ## Lệnh & hạ tầng (điền theo dự án)
18
+ - Môi trường: <!-- staging URL / production URL -->
19
+ - Lệnh deploy: {{DEPLOY_CMD}}
20
+ - Lệnh rollback: <!-- ... -->
21
+
22
+ ## Cạm bẫy thường gặp
23
+ - Migration phá tương thích ngược → version cũ lỗi trong lúc rolling.
24
+ - Deploy thủ công không lặp lại được → thiếu nhất quán giữa các lần.
25
+ - Không có rollback rõ ràng → sự cố kéo dài.
26
+
27
+ ## Tham chiếu
28
+ - `skills/devops/docker.md`, `skills/devops/github-actions.md`
29
+ - `workflows/release.md`, `workflows/incident-response.md`
@@ -0,0 +1,24 @@
1
+ <!-- Mục đích: build & chạy bằng Docker. Load khi task thuộc loại này. -->
2
+ # Skill: Docker
3
+
4
+ ## Khi nào dùng
5
+ Viết/sửa Dockerfile, đóng gói image, tối ưu build, chạy local bằng container/compose.
6
+
7
+ ## Quy tắc / pattern
8
+ - **Multi-stage build**: tách stage build và runtime; image cuối chỉ chứa artifact + runtime cần thiết.
9
+ - **Base image nhỏ & ghim version**: dùng `slim`/`alpine`/`distroless`; ghim tag cụ thể, không dùng `latest`.
10
+ - **Tận dụng layer cache**: copy file manifest (`package.json`/`go.mod`...) và cài deps TRƯỚC khi copy source.
11
+ - **`.dockerignore`**: loại `node_modules`, `.git`, build artifact, `.env` để build nhanh & tránh lộ secret.
12
+ - **Chạy non-root**: tạo user riêng, `USER app`; không chạy bằng root.
13
+ - **Cấu hình qua ENV**, không hardcode; secret truyền lúc runtime, không bake vào image.
14
+ - **HEALTHCHECK** để orchestrator biết container sống/chết.
15
+ - Một process chính mỗi container; log ra stdout/stderr.
16
+
17
+ ## Cạm bẫy thường gặp
18
+ - `COPY . .` trước khi cài deps → vỡ cache, build lại từ đầu mỗi lần.
19
+ - Bake secret/`.env` vào image (còn trong layer history dù đã xoá).
20
+ - Image phình do để cả devDependencies/build tool trong stage runtime.
21
+
22
+ ## Tham chiếu
23
+ - Build/deploy: `skills/devops/deployment.md`, `skills/devops/github-actions.md`
24
+ - Stack & version: `core/tech-stack.md`
@@ -0,0 +1,26 @@
1
+ <!-- Mục đích: pipeline CI/CD GitHub Actions. Load khi task thuộc loại này. -->
2
+ # Skill: GitHub Actions
3
+
4
+ ## Khi nào dùng
5
+ Tạo/sửa workflow CI/CD trong `.github/workflows/`, cấu hình test/build/deploy tự động.
6
+
7
+ ## Quy tắc / pattern
8
+ - **Cấu trúc**: trigger (`on:`) → jobs → steps. Tách job `lint`/`test`/`build`/`deploy` cho rõ ràng và song song được.
9
+ - **Ghim version action**: dùng tag (hoặc SHA cho action bên thứ ba) thay vì nhánh động.
10
+ - **Cache dependencies**: `actions/cache` hoặc `cache:` của setup action để CI nhanh.
11
+ - **Matrix** khi cần test nhiều version runtime/OS.
12
+ - **Secret & quyền**:
13
+ - Dùng `secrets`, không in ra log; `permissions:` tối thiểu cho `GITHUB_TOKEN`.
14
+ - Ưu tiên **OIDC** để auth cloud thay vì lưu credential tĩnh.
15
+ - Cẩn trọng với `pull_request_target` (chạy với quyền cao + code chưa tin cậy).
16
+ - **Gate merge**: bật required status checks; deploy chỉ chạy sau khi test xanh (`needs:`).
17
+ - **Environment + approval** cho deploy production.
18
+ - **Concurrency**: huỷ run cũ khi push mới (`concurrency:` + `cancel-in-progress`).
19
+
20
+ ## Cạm bẫy thường gặp
21
+ - Echo secret hoặc để secret rơi vào log/artifact.
22
+ - Không pin action → bản mới làm vỡ pipeline.
23
+ - Cài lại deps mỗi lần vì thiếu cache → CI chậm & tốn phút.
24
+
25
+ ## Tham chiếu
26
+ - Đóng gói: `skills/devops/docker.md` · Phát hành: `skills/devops/deployment.md`, `workflows/release.md`
@@ -0,0 +1,25 @@
1
+ <!-- Mục đích: tích hợp Firebase phía frontend. Load khi task thuộc loại này. -->
2
+ <!-- Nội dung dưới là MẪU minh hoạ pattern. Sửa theo code thật của dự án bạn. -->
3
+ # Skill: CarePay Firebase
4
+
5
+ ## Khi nào dùng
6
+ Tích hợp Firebase phía client: đăng nhập (Auth), đọc realtime Firestore, gọi callable function, dùng emulator khi dev.
7
+
8
+ ## Quy tắc / pattern
9
+ - **Khởi tạo một lần**: tạo app/Auth/Firestore ở một module dùng chung; không `initializeApp` rải rác.
10
+ - **Gọi backend qua callable** (`httpsCallable`) cho mọi mutation — KHÔNG ghi trực tiếp collection tiền bạc từ client (chặn ở Security Rules; xem `architecture.md`).
11
+ - **Đọc realtime đúng chỗ**: dùng `onSnapshot` cho dữ liệu thay đổi (trạng thái Payment), `getDoc` cho đọc một lần. **Luôn huỷ subscribe** khi unmount (cleanup trong `useEffect`).
12
+ - **Truyền idempotencyKey** (uuid client tạo) khi gọi `createPayment`; retry dùng lại cùng key (BR-002).
13
+ - **Xử lý đủ trạng thái** loading / error / empty (xem `skills/frontend/react.md`, `ui-guideline.md`).
14
+ - **Map lỗi `HttpsError`**: đọc `error.code`/`error.message` từ callable để hiện thông báo thân thiện theo `code`.
15
+ - **Emulator khi dev**: trỏ Auth/Firestore/Functions sang emulator qua env, không chạm project thật.
16
+ - **Không để secret trong client**: chỉ config Firebase công khai; logic nhạy cảm ở functions.
17
+
18
+ ## Cạm bẫy thường gặp
19
+ - Quên huỷ `onSnapshot` → rò rỉ listener, cập nhật state sau khi unmount.
20
+ - Ghi thẳng Firestore để "nhanh" → vỡ bảo mật & business rule (phải qua function).
21
+ - Token hết hạn sau khi đổi claim → gọi `getIdToken(true)` để refresh.
22
+
23
+ ## Tham chiếu
24
+ - `skills/frontend/react.md` · `architecture.md` · `decisions/ADR-001-auth.md`
25
+ - Backend tương ứng: `skills/backend/carepay-oncall-gen2.md`
@@ -0,0 +1,24 @@
1
+ <!-- Mục đích: convention React trong dự án. Load khi task thuộc loại này. -->
2
+ # Skill: React
3
+
4
+ ## Khi nào dùng
5
+ Viết/sửa component, hook, quản lý state, fetch dữ liệu phía React.
6
+
7
+ ## Quy tắc / pattern
8
+ - **Function component + hooks**; không dùng class. Một component một trách nhiệm, giữ nhỏ.
9
+ - **Tách logic ra custom hook** (`useXxx`) khi dùng lại được; tuân thủ rules-of-hooks (gọi ở top level).
10
+ - **State đặt đúng chỗ**: cục bộ thì `useState`; chia sẻ gần thì lift up / context; server state thì dùng lib data-fetching (vd React Query) — đừng nhồi tất cả vào global store.
11
+ - **Data fetching**: xử lý đủ 3 trạng thái loading / error / empty; tránh fetch trong vòng lặp render.
12
+ - **Key danh sách** ổn định, không dùng index khi list có thể đổi thứ tự.
13
+ - **Effect đúng mục đích**: `useEffect` cho side-effect + dọn dẹp (cleanup); không dùng effect để tính giá trị dẫn xuất (tính thẳng khi render hoặc `useMemo`).
14
+ - **Tối ưu có đo lường**: chỉ `memo`/`useMemo`/`useCallback` khi thật sự cần; tránh tối ưu sớm.
15
+ - **Controlled component** cho form; validate rõ ràng.
16
+ - **A11y**: dùng thẻ ngữ nghĩa, `label` cho input, hỗ trợ bàn phím.
17
+
18
+ ## Cạm bẫy thường gặp
19
+ - Thiếu/sai dependency array của `useEffect` → stale closure hoặc loop vô hạn.
20
+ - Lạm dụng global state cho dữ liệu server → khó đồng bộ, dễ lệch.
21
+ - Mutate trực tiếp state/props thay vì tạo bản mới.
22
+
23
+ ## Tham chiếu
24
+ - `skills/frontend/ui-guideline.md` · `core/coding-standards.md` · ví dụ: `examples/coding-example.md`
@@ -0,0 +1,29 @@
1
+ <!-- Mục đích: hướng dẫn UI/UX, design tokens. Load khi task thuộc loại này. -->
2
+ # Skill: UI Guideline
3
+
4
+ ## Khi nào dùng
5
+ Dựng giao diện, đảm bảo nhất quán về spacing, màu, typography, trạng thái và accessibility.
6
+
7
+ ## Quy tắc / pattern
8
+ - **Design token, không magic value**: màu/spacing/font lấy từ token tập trung (theme), không hardcode hex/px rải rác.
9
+ - **Thang spacing nhất quán**: dùng scale (vd 4/8/12/16/24/32). Không chế số lẻ tuỳ tiện.
10
+ - **Typography có hệ thống**: vài cấp heading/body rõ ràng; giới hạn số font/size.
11
+ - **Responsive mobile-first**: thiết kế cho màn nhỏ trước, mở rộng bằng breakpoint.
12
+ - **Đủ trạng thái UI**: luôn xử lý loading / empty / error / success — không chỉ happy path.
13
+ - **Phản hồi tương tác**: hover/focus/active/disabled rõ ràng; thao tác lâu phải có loading indicator.
14
+ - **Accessibility (WCAG)**: tương phản màu đạt chuẩn; focus nhìn thấy; điều hướng được bằng bàn phím; có `alt`/aria khi cần.
15
+ - **Component tái dùng**: ưu tiên component dùng chung thay vì copy style; giữ biến thể (variant) trong một nơi.
16
+
17
+ <!-- Điền token/brand thật của dự án (màu, font, breakpoint) hoặc trỏ tới design system: -->
18
+ ## Token dự án (điền theo dự án)
19
+ - Màu chính / phụ: <!-- ... -->
20
+ - Font: <!-- ... -->
21
+ - Breakpoints: <!-- ... -->
22
+
23
+ ## Cạm bẫy thường gặp
24
+ - Hardcode màu/spacing → khó đổi theme, dễ lệch.
25
+ - Quên trạng thái empty/error → UI vỡ với dữ liệu thật.
26
+ - Bỏ qua focus/contrast → không dùng được bằng bàn phím / người khiếm thị.
27
+
28
+ ## Tham chiếu
29
+ - `skills/frontend/react.md` · `core/coding-standards.md`
@@ -0,0 +1,26 @@
1
+ <!-- Mục đích: hợp đồng API của feature. -->
2
+ <!-- Nội dung dưới là MẪU (feature "Tạo thanh toán"). Thay bằng API thật của bạn. -->
3
+ # Feature A — API
4
+
5
+ ## `callable createPayment` (onCall — cần Auth)
6
+ - **Mô tả**: tạo một thanh toán cho Provider; idempotent theo `idempotencyKey`.
7
+ - **Request**:
8
+ ```json
9
+ { "providerId": "prov_123", "amount": 250000, "idempotencyKey": "uuid-v4" }
10
+ ```
11
+ - **Response (success)**:
12
+ ```json
13
+ { "paymentId": "pay_abc", "status": "pending" }
14
+ ```
15
+ - **Lỗi** (chuẩn body: `code` máy đọc + `message` người đọc):
16
+ | code | Khi nào |
17
+ |---|---|
18
+ | `UNAUTHENTICATED` | Thiếu/sai Auth token (BR-005) |
19
+ | `VALIDATION_ERROR` | `amount` ≤ 0 hoặc vượt hạn mức (BR-001) |
20
+ | `PROVIDER_NOT_FOUND` | `providerId` không tồn tại |
21
+ | `INSUFFICIENT_BALANCE` | Số dư không đủ (nếu trả từ ví, BR-004) |
22
+
23
+ ## `POST /webhooks/payment` (onRequest — verify chữ ký gateway)
24
+ - **Mô tả**: gateway báo kết quả; chuyển trạng thái Payment (BR-003). Idempotent theo `gatewayRef`.
25
+ - **Request**: payload của gateway + header chữ ký.
26
+ - **Response**: `200` khi đã xử lý (kể cả no-op nếu trùng); `400` nếu chữ ký sai.
@@ -0,0 +1,12 @@
1
+ <!-- Mục đích: thiết kế kỹ thuật của feature. -->
2
+ <!-- Nội dung dưới là MẪU (feature "Tạo thanh toán"). Thay bằng feature thật của bạn. -->
3
+ # Feature A — Design
4
+ - **Tiếp cận**:
5
+ - Callable `createPayment` (onCall) verify Auth → validate (BR-001) → "tạo nếu chưa có" theo `idempotencyKey` trong Firestore transaction → gọi Payment Gateway → ghi `payments/{id}` status `pending`.
6
+ - Webhook `paymentWebhook` (onRequest) verify chữ ký gateway → chuyển trạng thái theo BR-003.
7
+ - Trigger `onPaymentSucceeded` (Firestore trigger) cập nhật `wallets/{uid}` + ghi `transactions` (append-only) + bắn thông báo.
8
+ - **Thay đổi data model**: thêm collection `payments`, `idempotency/{key}`, subcollection `wallets/{uid}/transactions`. Index composite cho `payments` theo `userId + createdAt`.
9
+ - **Đánh đổi**:
10
+ - Xử lý bất đồng bộ (gateway → webhook → trigger) phức tạp hơn đồng bộ, nhưng tránh giữ request lâu và chịu được retry.
11
+ - Tốn thêm đọc/ghi khoá idempotency mỗi giao dịch (chấp nhận, đổi lấy an toàn — ADR-002).
12
+ - **Liên quan**: ADR-001 (auth), ADR-002 (idempotency), ADR-003 (logging). Cách viết function: `skills/backend/*`.
@@ -0,0 +1,13 @@
1
+ <!-- Mục đích: yêu cầu của feature. Copy thư mục feature-a/ này cho mỗi feature mới. -->
2
+ <!-- Nội dung dưới là MẪU (feature "Tạo thanh toán"). Thay bằng feature thật của bạn. -->
3
+ # Feature A — Tạo thanh toán (Create Payment)
4
+ - **Mục tiêu**: cho phép người dùng đã đăng nhập thanh toán một khoản viện phí cho Provider, an toàn và không bị tính trùng.
5
+ - **User story**: Là *bệnh nhân*, tôi muốn *thanh toán hoá đơn cho phòng khám* để *hoàn tất viện phí mà không phải tới quầy*.
6
+ - **Acceptance criteria**:
7
+ - [ ] Người dùng chọn Provider + nhập số tiền → tạo Payment `pending` rồi chuyển `succeeded` khi gateway xác nhận.
8
+ - [ ] Gọi lại cùng `idempotencyKey` không tạo thêm Payment (BR-002).
9
+ - [ ] Số tiền sai (≤0 hoặc vượt hạn mức) bị từ chối với thông báo rõ ràng (BR-001).
10
+ - [ ] User chỉ thấy/thao tác Payment của chính mình (BR-005).
11
+ - [ ] UI hiển thị đủ trạng thái loading / thành công / lỗi.
12
+ - **Ngoài phạm vi**: trả góp (Installment) — làm ở feature riêng; hoàn tiền; thanh toán cho người khác.
13
+ - **Business rules liên quan**: BR-001, BR-002, BR-003, BR-004, BR-005.
@@ -0,0 +1,12 @@
1
+ <!-- Mục đích: test case của feature. -->
2
+ <!-- Nội dung dưới là MẪU (feature "Tạo thanh toán"). Thay bằng test case thật của bạn. -->
3
+ # Feature A — Test Cases
4
+ | ID | Tình huống | Input | Kỳ vọng |
5
+ |----|-----------|-------|---------|
6
+ | TC-1 | Happy path | user đã đăng nhập, `amount=250000`, key mới | Tạo Payment `pending`; sau webhook → `succeeded`; ví cập nhật đúng |
7
+ | TC-2 | Idempotency (BR-002) | gọi lại cùng `idempotencyKey` | Trả về đúng Payment cũ, KHÔNG tạo bản mới |
8
+ | TC-3 | Số tiền không hợp lệ (BR-001) | `amount=0` hoặc vượt hạn mức | `VALIDATION_ERROR`, không gọi gateway |
9
+ | TC-4 | Chưa đăng nhập (BR-005) | không có Auth token | `UNAUTHENTICATED` |
10
+ | TC-5 | Webhook trùng (BR-003) | gateway gửi lại cùng `gatewayRef` | No-op; trạng thái & số dư không đổi |
11
+ | TC-6 | Webhook chữ ký sai | payload sai chữ ký | `400`, bỏ qua, không đổi trạng thái |
12
+ | TC-7 | Thứ tự đảo | webhook đến trước khi ghi `pending` | Khớp theo `gatewayRef`, xử lý đúng khi `pending` xuất hiện |
@@ -0,0 +1,25 @@
1
+ <!-- Mục đích: checklist review (đóng vai reviewer). -->
2
+ # Workflow: Code Review
3
+
4
+ > Review theo ưu tiên: chặn (P0) trước, góp ý (P2) sau. Bám `core/coding-standards.md`.
5
+
6
+ ## P0 — Phải sửa trước khi merge
7
+ - [ ] **Đúng yêu cầu**: khớp acceptance criteria trong `specs/<feature>/`.
8
+ - [ ] **Correctness**: logic đúng; xử lý edge case (null/rỗng/biên/timeout).
9
+ - [ ] **Bảo mật**: không hardcode secret; validate input; tránh injection/XSS; phân quyền đúng.
10
+ - [ ] **Test**: logic mới có test; test xanh; có cả happy path lẫn ca thất bại.
11
+
12
+ ## P1 — Nên sửa
13
+ - [ ] **Error handling**: không nuốt lỗi; tách lỗi nghiệp vụ vs hệ thống; log có ngữ cảnh.
14
+ - [ ] **Dữ liệu/đồng thời**: race condition, transaction, idempotency (nếu liên quan).
15
+ - [ ] **Hiệu năng**: không N+1 query, không load thừa, không vòng lặp tốn kém.
16
+ - [ ] **Tương thích**: không phá API/contract cũ; có migration nếu đổi schema.
17
+
18
+ ## P2 — Chất lượng
19
+ - [ ] Tên rõ nghĩa, hàm đủ nhỏ, không lặp code, không magic value.
20
+ - [ ] Không code chết / import thừa / log debug sót lại.
21
+ - [ ] Comment giải thích "vì sao", không lặp "cái gì".
22
+
23
+ ## Cách góp ý
24
+ - Ghi rõ mức (P0/P1/P2) + lý do; gợi ý cách sửa, không chỉ chê.
25
+ - Tách "bắt buộc" và "tuỳ chọn (nit)". Khen điểm tốt khi xứng đáng.
@@ -0,0 +1,37 @@
1
+ <!-- Mục đích: quy trình tạo feature mới (đóng luôn vai trò developer/architect). -->
2
+ # Workflow: Create Feature
3
+
4
+ ## Sinh spec từ mô tả (AI điền)
5
+ > Khi người dùng nói kiểu *"sinh spec cho tính năng <X>: <mô tả>"* — agent tự viết spec, KHÔNG bắt người dùng điền tay.
6
+
7
+ 1. **Tạo khung** — chạy `agent-kb feature <slug>` (hoặc tạo `specs/<slug>/` từ khung trống). Slug ngắn gọn theo tên feature.
8
+ 2. **Đọc context trước khi viết** — `product/business-rules.md`, `product/domain-model.md`, `core/glossary.md`, `core/coding-standards.md` để spec khớp nghiệp vụ & quy ước sẵn có.
9
+ 3. **Điền 4 file** từ mô tả người dùng:
10
+ - `requirements.md`: mục tiêu, user story, acceptance criteria, ngoài phạm vi, BR liên quan.
11
+ - `design.md`: tiếp cận, thay đổi data model, đánh đổi.
12
+ - `api.md`: endpoint, request/response, mã lỗi (bỏ nếu feature không có API).
13
+ - `test-cases.md`: happy path + edge case + ca theo từng BR.
14
+ 4. **Quy tắc khi sinh**:
15
+ - Yêu cầu mơ hồ → **HỎI, không bịa** acceptance criteria/BR.
16
+ - Tham chiếu BR sẵn có theo mã (vd BR-001); **không tự đẻ rule mới** — thiếu rule thì đề xuất rồi hỏi.
17
+ - Giữ nhất quán với `domain-model.md` (tên entity) và `glossary.md` (thuật ngữ).
18
+ - Điền xong **xoá dòng `<!-- AI: ... -->`** trong mỗi file.
19
+ 5. **Dừng cho người dùng DUYỆT spec** rồi mới sang phần "Quy trình" code/test bên dưới (spec-first).
20
+
21
+ ## Quy trình
22
+ 1. **Hiểu yêu cầu** — đọc `specs/<feature>/requirements.md`. Chưa có thư mục spec thì tạo nhanh bằng `agent-kb feature <tên>`, rồi viết trước (mục tiêu, user story, acceptance criteria, ngoài phạm vi, BR liên quan).
23
+ 2. **Thiết kế** — `specs/<feature>/design.md`: tiếp cận, thay đổi data model, đánh đổi. Quyết định lớn → thêm ADR vào `decisions/`.
24
+ 3. **Chốt API** — nếu có endpoint, ghi hợp đồng vào `specs/<feature>/api.md` trước khi code.
25
+ 4. **Code** — theo `core/coding-standards.md` + skill liên quan (`skills/backend|frontend/*`). Commit nhỏ, từng phần chạy được.
26
+ 5. **Test** — viết theo `specs/<feature>/test-cases.md`; phủ happy path + edge case + business rule.
27
+ 6. **Tự review** — chạy `workflows/code-review.md` trước khi mở PR.
28
+
29
+ ## Definition of Done
30
+ - [ ] Đủ acceptance criteria; không vỡ tính năng cũ.
31
+ - [ ] Test xanh, có cho cả ca lỗi.
32
+ - [ ] Đã cập nhật doc liên quan (spec/ADR/glossary).
33
+ - [ ] Không secret/log debug sót; đã tự review.
34
+
35
+ ## Lưu ý
36
+ - Mơ hồ yêu cầu thì hỏi, đừng đoán.
37
+ - Phạm vi phình to → tách feature nhỏ hơn.
@@ -0,0 +1,16 @@
1
+ <!-- Mục đích: quy trình fix bug. -->
2
+ # Workflow: Fix Bug
3
+
4
+ ## Quy trình
5
+ 1. **Tái hiện** — dựng lại bug một cách ổn định; ghi rõ bước tái hiện + môi trường + kết quả mong đợi vs thực tế.
6
+ 2. **Tra cứu** — check `memory/common-bugs.md` và `memory/troubleshooting.md` xem đã gặp chưa.
7
+ 3. **Khoanh vùng** — thu hẹp dần (log, bisect, test nhỏ) tới nơi gây lỗi.
8
+ 4. **Root cause** — tìm nguyên nhân gốc, không vá triệu chứng. Hỏi "vì sao" tới khi tới gốc.
9
+ 5. **Test bắt bug** — viết test fail trước, tái hiện đúng bug, rồi mới sửa cho test xanh (regression test).
10
+ 6. **Sửa** — đổi nhỏ nhất đủ giải quyết gốc; rà các nơi khác cùng pattern.
11
+ 7. **Xác minh** — chạy lại bước tái hiện + toàn bộ test liên quan.
12
+ 8. **Ghi lại** — nếu đáng nhớ, thêm vào `memory/common-bugs.md` (triệu chứng → nguyên nhân → cách xử).
13
+
14
+ ## Lưu ý
15
+ - Bug production gấp → ưu tiên giảm thiểu trước theo `workflows/incident-response.md`, sửa gốc sau.
16
+ - Không xoá test/giảm assertion để "qua bài".
@@ -0,0 +1,19 @@
1
+ <!-- Mục đích: ứng phó sự cố production. -->
2
+ # Workflow: Incident Response
3
+
4
+ ## Phân loại mức độ (severity)
5
+ - **SEV1**: sập/dừng dịch vụ, mất/lộ dữ liệu → xử lý ngay, báo động.
6
+ - **SEV2**: lỗi nặng nhưng còn workaround → xử lý trong giờ.
7
+ - **SEV3**: ảnh hưởng nhỏ → đưa vào backlog.
8
+
9
+ ## Quy trình
10
+ 1. **Giảm thiểu trước** — khôi phục dịch vụ là ưu tiên #1: rollback, tắt feature flag, scale, chặn nguồn lỗi. Chưa cần biết root cause.
11
+ 2. **Chỉ định người điều phối** — 1 người chủ trì (incident commander); những người khác hỗ trợ.
12
+ 3. **Cập nhật liên lạc** — thông báo bên liên quan; cập nhật định kỳ trạng thái cho tới khi xong.
13
+ 4. **Ghi timeline** — mốc thời gian: phát hiện → hành động → kết quả. Ghi ngay khi đang xử lý.
14
+ 5. **Xác nhận đã hồi phục** — theo dõi metric/log đủ lâu để chắc chắn ổn định.
15
+
16
+ ## Sau sự cố
17
+ - **Postmortem không đổ lỗi**: chuyện gì xảy ra, vì sao, phát hiện thế nào, cách phòng tái diễn.
18
+ - Ghi bài học → `memory/lessons-learned.md`; bug gốc → `workflows/fix-bug.md` + `memory/common-bugs.md`.
19
+ - Tạo action item có người chịu trách nhiệm và hạn.
@@ -0,0 +1,24 @@
1
+ <!-- Mục đích: vòng tự học — chốt bài học sau mỗi task/incident vào memory/. Load khi cần ghi lại kinh nghiệm. -->
2
+ # Workflow: Learn (tự học)
3
+
4
+ > Sau mỗi bug khó, incident, hoặc khi người dùng sửa cách làm — agent **chủ động ghi lại** để lần sau không lặp. Đây là thứ biến `memory/` thành vòng lặp sống thay vì file chết.
5
+
6
+ ## Khi nào chạy
7
+ - Vừa fix xong một bug đáng nhớ (root cause không hiển nhiên).
8
+ - Sau postmortem một incident.
9
+ - Người dùng chỉnh cách làm: *"lần sau làm X thay vì Y"*, *"đừng bao giờ Z"*.
10
+
11
+ ## Ghi vào đâu
12
+ | Loại | File |
13
+ |---|---|
14
+ | Bài học chung (cách làm) | `memory/lessons-learned.md` — *chuyện gì → học được gì → đổi cách làm thế nào* |
15
+ | Bug hay tái diễn | `memory/common-bugs.md` — *triệu chứng → nguyên nhân gốc → cách xử* |
16
+ | Quy trình gỡ rối theo tình huống | `memory/troubleshooting.md` |
17
+ | Quyết định kiến trúc | tạo ADR: `agent-kb adr <tiêu đề>` |
18
+
19
+ ## Quy tắc
20
+ - Mục **ngắn gọn, có ngày** (YYYY-MM-DD). Append, không sửa lịch sử.
21
+ - Chỉ ghi cái **khái quát hoá được** (có thể lặp ở task khác) — không ghi chi tiết vụn dùng một lần.
22
+ - Trùng mục cũ → **cập nhật** mục đó, đừng tạo bản sao.
23
+ - **Không ghi** secret/PII/dữ liệu nhạy cảm.
24
+ - Mơ hồ "có đáng ghi không" → hỏi người dùng một câu, đừng tự phình memory.
@@ -0,0 +1,23 @@
1
+ <!-- Mục đích: quy trình release. -->
2
+ # Workflow: Release
3
+
4
+ ## Trước khi release (gate)
5
+ - [ ] Toàn bộ test xanh trên CI; không lỗi lint/build.
6
+ - [ ] Đã review & merge xong; nhánh release cập nhật từ main.
7
+ - [ ] Migration DB (nếu có) đã kiểm thử và có kế hoạch rollback.
8
+ - [ ] Biến môi trường / secret cho version mới đã sẵn sàng.
9
+
10
+ ## Phát hành
11
+ 1. **Version** — bump theo SemVer: MAJOR (phá vỡ tương thích) / MINOR (thêm tính năng) / PATCH (sửa lỗi).
12
+ 2. **Changelog** — ghi thay đổi theo nhóm Added / Changed / Fixed / Removed.
13
+ 3. **Tag** — gắn tag version, tạo release note.
14
+ 4. **Deploy** — theo `skills/devops/deployment.md` (ưu tiên rolling/blue-green để zero-downtime).
15
+
16
+ ## Sau release
17
+ - [ ] Smoke test các luồng chính trên production.
18
+ - [ ] Theo dõi metric/log/error rate trong khoảng đầu sau deploy.
19
+ - [ ] Có sự cố → `workflows/incident-response.md` (rollback nếu cần).
20
+
21
+ ## Nguyên tắc
22
+ - Release nhỏ, thường xuyên hơn là gom lớn.
23
+ - Tránh deploy sát giờ nghỉ / cuối tuần khi không có người trực.
@@ -0,0 +1,5 @@
1
+ # Copilot Instructions
2
+
3
+ Toàn bộ rule, tech-stack, coding-standards và cách load context nằm ở `AGENTS.md` tại gốc repo.
4
+ Hãy đọc và tuân theo `AGENTS.md`, đặc biệt phần "Router: task → file cần đọc".
5
+ Chỉ load file trong `.ai/` khớp với task hiện tại; không nuốt cả thư mục.
@@ -0,0 +1,5 @@
1
+ # agent-kb
2
+
3
+ Toàn bộ rule, tech-stack, coding-standards và cách load context nằm ở `AGENTS.md` tại gốc repo.
4
+ Hãy đọc và tuân theo `AGENTS.md`, đặc biệt phần "Router: task → file cần đọc thêm".
5
+ Chỉ load file trong `.ai/` khớp với task hiện tại; không nuốt cả thư mục.