ai-developer-skill-os 8.2.1 → 8.3.1

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 (151) hide show
  1. package/.agents/LICENSE +21 -21
  2. package/.agents/README.md +90 -90
  3. package/.agents/docs/CHI_TIET_SKILLS.md +125 -125
  4. package/.agents/docs/MIGRATION-CLEANUP-V8.1.3.md +36 -36
  5. package/.agents/docs/MIGRATION-STATUS.md +35 -35
  6. package/.agents/docs/MIGRATION-V8.md +10 -10
  7. package/.agents/docs/V8-CERTIFICATION.md +27 -27
  8. package/.agents/docs/decisions/ADR-001-v8-migration.md +58 -58
  9. package/.agents/docs/decisions/ADR-002-workflow-separation.md +50 -50
  10. package/.agents/docs/decisions/ADR-003-registry-generated.md +54 -54
  11. package/.agents/docs/decisions/ADR-008-skill-boundary-review.md +27 -27
  12. package/.agents/registry/capability-graph.yml +67 -25
  13. package/.agents/registry/graph.json +135 -256
  14. package/.agents/registry/index.yaml +68 -95
  15. package/.agents/registry/skills-index.yml +548 -525
  16. package/.agents/rules/anti-patterns.md +45 -0
  17. package/.agents/rules/coding.md +10 -0
  18. package/.agents/rules/command-safety.md +37 -14
  19. package/.agents/rules/priorities.yml +13 -2
  20. package/.agents/rules/security.md +47 -7
  21. package/.agents/rules/skill-quality.md +32 -8
  22. package/.agents/skills/_template/SKILL.md +133 -132
  23. package/.agents/skills/_template/capability.yaml +22 -8
  24. package/.agents/skills/_template/evals/scorecard.yaml +19 -19
  25. package/.agents/skills/qk-access-policy/SKILL.md +5 -2
  26. package/.agents/skills/qk-access-policy/capability.yaml +23 -0
  27. package/.agents/skills/qk-access-policy/evals/scorecard.yaml +36 -0
  28. package/.agents/skills/qk-agent-observability/SKILL.md +112 -1
  29. package/.agents/skills/qk-agent-observability/capability.yaml +29 -0
  30. package/.agents/skills/qk-agent-observability/evals/scorecard.yaml +29 -0
  31. package/.agents/skills/qk-agent-observability/references/scorecard.yaml +80 -0
  32. package/.agents/skills/qk-ai-builder/SKILL.md +75 -6
  33. package/.agents/skills/qk-ai-builder/capability.yaml +23 -0
  34. package/.agents/skills/qk-ai-builder/evals/scorecard.yaml +30 -0
  35. package/.agents/skills/qk-api-lifecycle/SKILL.md +5 -3
  36. package/.agents/skills/qk-api-lifecycle/capability.yaml +23 -0
  37. package/.agents/skills/qk-api-lifecycle/evals/scorecard.yaml +29 -0
  38. package/.agents/skills/qk-bug-resolution/SKILL.md +4 -22
  39. package/.agents/skills/qk-bug-resolution/capability.yaml +25 -0
  40. package/.agents/skills/qk-bug-resolution/evals/scorecard.yaml +30 -0
  41. package/.agents/skills/qk-code-review/SKILL.md +188 -186
  42. package/.agents/skills/qk-code-review/capability.yaml +23 -0
  43. package/.agents/skills/qk-code-review/evals/scorecard.yaml +29 -0
  44. package/.agents/skills/qk-context-loader/SKILL.md +4 -12
  45. package/.agents/skills/qk-context-loader/capability.yaml +23 -0
  46. package/.agents/skills/qk-context-loader/evals/scorecard.yaml +28 -0
  47. package/.agents/skills/qk-data-lifecycle/SKILL.md +7 -2
  48. package/.agents/skills/qk-data-lifecycle/capability.yaml +23 -0
  49. package/.agents/skills/qk-data-lifecycle/evals/scorecard.yaml +29 -0
  50. package/.agents/skills/qk-db-optimizer/SKILL.md +4 -3
  51. package/.agents/skills/qk-db-optimizer/capability.yaml +22 -0
  52. package/.agents/skills/qk-db-optimizer/evals/scorecard.yaml +28 -0
  53. package/.agents/skills/qk-design-system-engineering/SKILL.md +235 -112
  54. package/.agents/skills/qk-design-system-engineering/capability.yaml +25 -0
  55. package/.agents/skills/qk-design-system-engineering/evals/scorecard.yaml +27 -0
  56. package/.agents/skills/qk-devops-platform/SKILL.md +241 -117
  57. package/.agents/skills/qk-devops-platform/capability.yaml +29 -0
  58. package/.agents/skills/qk-devops-platform/evals/scorecard.yaml +28 -0
  59. package/.agents/skills/qk-docs/SKILL.md +4 -2
  60. package/.agents/skills/qk-docs/capability.yaml +23 -0
  61. package/.agents/skills/qk-docs/evals/scorecard.yaml +27 -0
  62. package/.agents/skills/qk-engineering-standard/SKILL.md +5 -76
  63. package/.agents/skills/qk-engineering-standard/capability.yaml +23 -0
  64. package/.agents/skills/qk-engineering-standard/evals/scorecard.yaml +28 -0
  65. package/.agents/skills/qk-engineering-standard/references/anti-patterns.md +121 -0
  66. package/.agents/skills/qk-engineering-standard/rules/frontend.md +1 -1
  67. package/.agents/skills/qk-fe-api-integration/SKILL.md +14 -33
  68. package/.agents/skills/qk-fe-api-integration/capability.yaml +21 -0
  69. package/.agents/skills/qk-fe-api-integration/evals/scorecard.yaml +29 -0
  70. package/.agents/skills/qk-feature-delivery/SKILL.md +54 -222
  71. package/.agents/skills/qk-feature-delivery/capability.yaml +24 -0
  72. package/.agents/skills/qk-feature-delivery/evals/scorecard.yaml +28 -0
  73. package/.agents/skills/qk-frontend-architecture/SKILL.md +258 -134
  74. package/.agents/skills/qk-frontend-architecture/capability.yaml +28 -0
  75. package/.agents/skills/qk-frontend-architecture/evals/scorecard.yaml +28 -0
  76. package/.agents/skills/qk-help/SKILL.md +23 -161
  77. package/.agents/skills/qk-help/capability.yaml +20 -0
  78. package/.agents/skills/qk-help/evals/scorecard.yaml +13 -0
  79. package/.agents/skills/qk-orchestrator/SKILL.md +3 -35
  80. package/.agents/skills/qk-orchestrator/capability.yaml +22 -0
  81. package/.agents/skills/qk-orchestrator/evals/scorecard.yaml +27 -0
  82. package/.agents/skills/qk-orchestrator/references/routing-table.md +15 -3
  83. package/.agents/skills/qk-product-specification/SKILL.md +253 -130
  84. package/.agents/skills/qk-product-specification/capability.yaml +27 -0
  85. package/.agents/skills/qk-product-specification/evals/scorecard.yaml +27 -0
  86. package/.agents/skills/qk-production-release/SKILL.md +33 -68
  87. package/.agents/skills/qk-production-release/capability.yaml +27 -0
  88. package/.agents/skills/qk-production-release/evals/scorecard.yaml +28 -0
  89. package/.agents/skills/qk-project-bootstrap/SKILL.md +59 -8
  90. package/.agents/skills/qk-project-bootstrap/capability.yaml +23 -0
  91. package/.agents/skills/qk-project-bootstrap/evals/scorecard.yaml +28 -0
  92. package/.agents/skills/qk-project-health/SKILL.md +5 -3
  93. package/.agents/skills/qk-project-health/capability.yaml +23 -0
  94. package/.agents/skills/qk-project-health/evals/scorecard.yaml +27 -0
  95. package/.agents/skills/qk-project-memory/SKILL.md +4 -2
  96. package/.agents/skills/qk-project-memory/capability.yaml +23 -0
  97. package/.agents/skills/qk-project-memory/evals/scorecard.yaml +27 -0
  98. package/.agents/skills/qk-refactor/SKILL.md +117 -0
  99. package/.agents/skills/qk-refactor/capability.yaml +26 -0
  100. package/.agents/skills/qk-refactor/evals/scorecard.yaml +27 -0
  101. package/.agents/skills/qk-security-audit/SKILL.md +259 -135
  102. package/.agents/skills/qk-security-audit/capability.yaml +30 -0
  103. package/.agents/skills/qk-security-audit/evals/scorecard.yaml +27 -0
  104. package/.agents/skills/qk-system-evolution/SKILL.md +18 -68
  105. package/.agents/skills/qk-system-evolution/capability.yaml +24 -0
  106. package/.agents/skills/qk-system-evolution/evals/scorecard.yaml +26 -0
  107. package/.agents/skills/qk-test-engineering/SKILL.md +262 -139
  108. package/.agents/skills/qk-test-engineering/capability.yaml +28 -0
  109. package/.agents/skills/qk-test-engineering/evals/scorecard.yaml +26 -0
  110. package/.agents/skills/qk-ui-audit/SKILL.md +17 -90
  111. package/.agents/skills/qk-ui-audit/capability.yaml +23 -0
  112. package/.agents/skills/qk-ui-audit/evals/scorecard.yaml +26 -0
  113. package/.agents/skills/qk-ui-audit/references/anti-slop-checklist.md +2 -2
  114. package/.agents/skills/qk-ui-builder/SKILL.md +482 -509
  115. package/.agents/skills/qk-ui-builder/capability.yaml +29 -0
  116. package/.agents/skills/qk-ui-builder/references/component-cookbook.md +455 -1191
  117. package/.agents/skills/qk-ui-system-builder/SKILL.md +2 -6
  118. package/.agents/skills/qk-ui-system-builder/capability.yaml +25 -0
  119. package/.agents/skills/qk-ui-system-builder/evals/scorecard.yaml +26 -0
  120. package/.agents/skills/qk-validation-gate/SKILL.md +1 -75
  121. package/.agents/skills/qk-validation-gate/capability.yaml +23 -0
  122. package/.agents/skills/qk-validation-gate/evals/scorecard.yaml +26 -0
  123. package/.agents/skills/qk-web-quality-gate/SKILL.md +232 -114
  124. package/.agents/skills/qk-web-quality-gate/capability.yaml +24 -0
  125. package/.agents/skills/qk-web-quality-gate/evals/scorecard.yaml +26 -0
  126. package/.agents/workflows/_schema.yml +146 -109
  127. package/.agents/workflows/bug-resolution.yml +121 -101
  128. package/.agents/workflows/code-review.yml +93 -77
  129. package/.agents/workflows/documentation.yml +90 -75
  130. package/.agents/workflows/feature-delivery.yml +120 -103
  131. package/.agents/workflows/production-release.yml +173 -0
  132. package/.agents/workflows/refactor.yml +99 -81
  133. package/.agents/workflows/research.yml +75 -60
  134. package/.agents/workflows/security-audit.yml +115 -72
  135. package/.agents/workflows/skill-evolution.yml +97 -65
  136. package/.agents/workflows/spec-driven-development.yml +87 -57
  137. package/CHANGELOG.md +27 -0
  138. package/README.md +90 -90
  139. package/bin/install.js +329 -179
  140. package/package.json +4 -2
  141. package/tooling/build-registry.js +186 -186
  142. package/tooling/fix-refactor.js +8 -0
  143. package/tooling/sync-versions.js +49 -0
  144. package/tooling/validate-graph.js +87 -87
  145. package/.agents/CHANGELOG.md +0 -131
  146. package/.agents/learnings/draft/README.md +0 -37
  147. package/.agents/reports/RELEASE-CHECKLIST.md +0 -29
  148. package/.agents/reports/architecture-audit.md +0 -13
  149. package/.agents/reports/graph-health.md +0 -20
  150. package/.agents/reports/skill-audit.md +0 -215
  151. package/tooling/generate-registry.js +0 -157
@@ -0,0 +1,23 @@
1
+ # Auto-generated from SKILL.md frontmatter
2
+ schema_version: 1
3
+ id: "qk-engineering-standard"
4
+ version: "8.3.1"
5
+ description: "Ép buộc SOLID, DRY, Clean Code với ngưỡng số liệu cụ thể — không có rule mơ hồ."
6
+ tools:
7
+ - "filesystem"
8
+ - "terminal"
9
+ knowledge:
10
+ owns:
11
+ - "coding-standards"
12
+ - "best-practices"
13
+ references:
14
+ - "architecture"
15
+ - "security"
16
+ - "anti-patterns"
17
+ eval:
18
+ scorecard: "evals/scorecard.yaml"
19
+ decision_boundary:
20
+ owns:
21
+ - "qk-engineering-standard"
22
+ does_not_own: []
23
+ conflicts_with: []
@@ -0,0 +1,28 @@
1
+ name: qk-engineering-standard-eval
2
+ description: Đánh giá việc áp dụng Tiêu chuẩn Kỹ thuật và Clean Code
3
+ version: 8.3.1
4
+ threshold: 80 # Đánh giá tính chính xác của việc tính điểm Health Score
5
+
6
+ metrics:
7
+ - id: concrete_thresholds
8
+ name: Áp dụng Thresholds định lượng
9
+ description: Agent có áp dụng đúng các ngưỡng cứng (Concrete Thresholds) không?
10
+ weight: 40
11
+ criteria:
12
+ - Nhận diện đúng hàm > 30 dòng, độ phức tạp > 10, file > 300 dòng (20đ)
13
+ - Phát hiện mã trùng lặp (DRY violation) nếu lặp lại >= 3 lần (20đ)
14
+
15
+ - id: health_score_calculation
16
+ name: Chấm điểm Health Score
17
+ description: Báo cáo có tính toán điểm sức khỏe (Health Score) chuẩn xác không?
18
+ weight: 35
19
+ criteria:
20
+ - Trừ điểm đúng theo thang điểm (CRITICAL: -25, HIGH: -10, MEDIUM: -5, LOW: -2) (20đ)
21
+ - Trả về đúng mức Exit Code tương ứng (SUCCESS nếu >=80, FAILED nếu <60) (15đ)
22
+
23
+ - id: non_intrusive_reporting
24
+ name: Báo cáo không can thiệp (Read-only)
25
+ description: Agent có tuân thủ quy tắc chỉ report mà không tự ý sửa code không?
26
+ weight: 25
27
+ criteria:
28
+ - Giữ nguyên trạng thái read-only, chỉ cung cấp report và suggestion (không tự sửa file) (25đ)
@@ -0,0 +1,121 @@
1
+ # 🚫 Anti-Patterns Blacklist — Engineering Standard
2
+
3
+ > Đây là danh sách đỏ. AI Agent **KHÔNG ĐƯỢC PHÉP** tạo ra code vi phạm các mục dưới đây,
4
+ > trừ khi người dùng yêu cầu tường minh và chấp nhận rủi ro (kèm comment giải thích lý do).
5
+ > Mục tiêu: chống "code rác" (slop), giữ codebase dễ bảo trì, an toàn kiểu dữ liệu, và có thể mở rộng.
6
+
7
+ ---
8
+
9
+ ## 1. TypeScript
10
+
11
+ | Cấm | Thay bằng |
12
+ |---|---|
13
+ | `any` tùy tiện | `unknown` + type guard, hoặc định nghĩa type/interface cụ thể |
14
+ | `// @ts-ignore` không có lý do | `// @ts-expect-error: <lý do cụ thể>` chỉ khi thực sự cần thiết tạm thời |
15
+ | Ép kiểu ép buộc (`as unknown as X`, `!` non-null assertion tràn lan) | Type guard, Zod/valibot schema validation ở boundary (API, form input) |
16
+ | Kiểu `object`, `Function` mơ hồ | Định nghĩa interface/type rõ ràng, dùng generic khi cần tái sử dụng |
17
+ | Enum số học không rõ nghĩa | `as const` object hoặc string union type |
18
+ | Interface/type định nghĩa lặp lại nhiều nơi | Tách vào `types/` hoặc co-locate cạnh feature, export dùng chung |
19
+
20
+ **Ví dụ SAI:**
21
+ ```ts
22
+ function handleData(data: any) {
23
+ return data.value; // không có gì đảm bảo `value` tồn tại
24
+ }
25
+ ```
26
+
27
+ **Ví dụ ĐÚNG:**
28
+ ```ts
29
+ interface ApiResponse {
30
+ value: string;
31
+ }
32
+ function handleData(data: ApiResponse) {
33
+ return data.value;
34
+ }
35
+ ```
36
+
37
+ ---
38
+
39
+ ## 2. React / UI
40
+
41
+ | Cấm | Thay bằng |
42
+ |---|---|
43
+ | Mutate state trực tiếp (`state.items.push(...)`, `state.x = y`) | Tạo object/array mới (`setState(prev => [...prev, item])`) hoặc dùng Immer |
44
+ | Spaghetti component: logic nghiệp vụ + fetch + JSX trộn chung 1 hàm khổng lồ | Tách Custom Hook (logic) khỏi Component (JSX thuần) — xem `component-cookbook.md` |
45
+ | Inline style (`style={{color: 'red'}}`) thay vì Design Token | Dùng class Tailwind ánh xạ token (`text-danger`), hoặc CSS variable đã định nghĩa |
46
+ | `useEffect` dùng để đồng bộ state phái sinh (derived state) | Tính toán trực tiếp trong render, hoặc `useMemo` nếu tốn kém |
47
+ | `useEffect` không có dependency array hoặc dependency sai (gây vòng lặp/render thừa) | Khai báo đầy đủ dependency, dùng ESLint `react-hooks/exhaustive-deps` |
48
+ | Component nhận > 5-6 props rời rạc không liên quan | Gom nhóm thành object prop, hoặc tách nhỏ component |
49
+ | Key trong list dùng `index` khi list có thể reorder/filter | Dùng ID ổn định (`item.id`) |
50
+ | Hardcode text UI trực tiếp (không chuẩn bị cho i18n) khi dự án có đa ngôn ngữ | Đưa qua lớp i18n / constants |
51
+ | Bỏ qua trạng thái loading / error / empty khi render dữ liệu async | Luôn xử lý đủ 3 trạng thái: loading, error, empty, success |
52
+ | Bỏ ARIA attributes / semantic HTML (`<div onClick>` thay vì `<button>`) | Dùng đúng thẻ semantic, thêm `aria-*` khi cần |
53
+
54
+ ---
55
+
56
+ ## 3. Kiến trúc (Architecture)
57
+
58
+ | Cấm | Thay bằng |
59
+ |---|---|
60
+ | Import chéo tạo circular dependency giữa các module | Tách shared logic ra module trung lập (`shared/`, `lib/`), kiểm tra bằng `madge` hoặc lint rule |
61
+ | Gọi API trực tiếp trong UI Component (`fetch()` ngay trong JSX/handler của component trình bày) | Tách vào `services/` hoặc data-layer hook (`useXxxQuery`) — component chỉ gọi hook |
62
+ | Business logic nằm trong Component thay vì layer riêng | Tách `hooks/`, `utils/`, `services/` — Component chỉ điều phối |
63
+ | Global mutable state ngoài store chính thức (biến module-level bị mutate) | Dùng Context/Zustand store có kiểm soát |
64
+ | Magic number/string rải rác trong code | Đưa vào `constants.ts` |
65
+ | Folder structure lộn xộn (component, hook, style của cùng 1 feature nằm rải rác nhiều nơi) | Co-location theo feature: `features/xxx/{components,hooks,services,types}` |
66
+ | Duplicate logic dán đè (copy-paste) ở nhiều nơi thay vì tái sử dụng | Trích xuất thành hàm/hook dùng chung |
67
+ | Commit code có `console.log` debug, code chết (dead code), TODO không có ticket | Dọn dẹp trước khi merge, hoặc gắn issue tracking rõ ràng |
68
+
69
+ ---
70
+
71
+ ## 4. React Query / TanStack Query
72
+
73
+ | Cấm | Thay bằng |
74
+ |---|---|
75
+ | Copy dữ liệu từ `useQuery` vào `useState` cục bộ (`const [x,setX]=useState(); useEffect(()=>setX(data),[data])`) | Dùng thẳng `data` trả về từ `useQuery` — nó đã là single source of truth |
76
+ | Tự quản lý loading/error bằng `useState` song song với `useQuery` | Dùng `isPending`/`isError`/`isFetching` có sẵn |
77
+ | `queryKey` viết tay rải rác nhiều nơi (`["user", id]` gõ lại ở 5 file khác nhau) | Tập trung vào 1 file `queryKeys.ts` theo factory pattern |
78
+ | Gọi `queryFn` chứa logic biến đổi dữ liệu phức tạp (mapping, tính toán nặng) | `queryFn` chỉ fetch thô; biến đổi dữ liệu qua `select` option hoặc hook riêng |
79
+ | Dùng `useQuery` cho dữ liệu thuần client (không đến từ server) | Đó là client state → dùng `useState`/Context/Zustand |
80
+ | `staleTime: 0` mặc định cho mọi query, gây refetch liên tục không cần thiết | Đặt `staleTime` phù hợp với tần suất đổi của dữ liệu |
81
+ | `invalidateQueries` tràn lan sau mọi mutation dù chỉ đổi 1 field nhỏ | Ưu tiên `setQueryData` cập nhật cache trực tiếp khi biết chính xác dữ liệu mới |
82
+ | Gọi `useQuery`/`useMutation` bên trong service/utility function (không phải React component/hook) | Hooks của React Query chỉ được gọi trong component hoặc custom hook |
83
+ | Nuốt lỗi mutation im lặng (không xử lý `onError`, không hiển thị gì cho user) | Luôn xử lý `onError` hoặc kiểm tra `error` để phản hồi UI |
84
+ | Trộn React Query với Redux/Zustand để lưu cùng một loại server-state ở 2 nơi | Server-state chỉ sống trong React Query cache, không đồng bộ ngược vào store khác |
85
+
86
+ ---
87
+
88
+ ## 5. TanStack Router / Table / Form / Virtual / Store
89
+
90
+ | Cấm | Thay bằng |
91
+ |---|---|
92
+ | Định nghĩa route bằng object thường, params/search không có type (dễ gõ sai tên param) | TanStack Router — dùng `createFileRoute`/`createRoute`, params & search suy kiểu tự động |
93
+ | Fetch dữ liệu trang trong component sau khi route đã mount (waterfall: chờ route load → mới fetch) | Prefetch trong `loader` của route (`loader: ({context}) => context.queryClient.ensureQueryData(...)`) |
94
+ | Đọc/ghi query string bằng `URLSearchParams` tay khi đã dùng TanStack Router | Dùng `useSearch`/`Route.useSearch()` có type-safe, validate qua schema (Zod) |
95
+ | Tự viết sort/filter/pagination state rời rạc bằng nhiều `useState` cho bảng dữ liệu | TanStack Table — quản lý qua `state` + `onXxxChange`, tách rõ khỏi cách render |
96
+ | Trộn logic tính toán dữ liệu bảng (sort/filter) vào trong JSX render row | Định nghĩa `columns` + xử lý qua Table instance (`table.getRowModel()`), JSX chỉ map render |
97
+ | Render toàn bộ hàng trăm/nghìn row DOM node cùng lúc trong Table/List | Kết hợp TanStack Virtual (`useVirtualizer`) để chỉ render row trong viewport |
98
+ | Tự quản lý field, error, touched bằng `useState` rời rạc cho form nhiều field | TanStack Form (`useForm`, `field.state`) — validate đồng bộ/bất đồng bộ tập trung, tránh re-render toàn form mỗi keystroke |
99
+ | Validate form chỉ ở client, không đồng bộ schema với backend | Dùng chung 1 schema (Zod) cho cả TanStack Form validator và backend validation |
100
+ | Đưa state UI đơn giản (theme, sidebar open/close) vào Redux/Context nặng nề | TanStack Store (hoặc `useState` cục bộ) cho state nhỏ gọn, framework-agnostic |
101
+ | Gọi trực tiếp DOM API để đo scroll/kích thước item thay vì dùng API của Virtual | Dùng `measureElement`/`estimateSize` của TanStack Virtual, tránh đọc/ghi layout thủ công gây jank |
102
+
103
+ ---
104
+
105
+ ## 6. Nguyên tắc review nhanh (Checklist trước khi xuất code)
106
+
107
+ - [ ] Không còn `any`/`ts-ignore` không giải thích
108
+ - [ ] Component tách rõ Logic (hook) / UI (JSX thuần)
109
+ - [ ] State được update immutable
110
+ - [ ] Không gọi API trực tiếp trong component trình bày
111
+ - [ ] Có xử lý loading/error/empty cho dữ liệu async
112
+ - [ ] Dùng Design Token, không inline style tùy tiện
113
+ - [ ] Không có circular dependency
114
+ - [ ] Không có console.log / code chết còn sót lại
115
+ - [ ] Server-state đi qua React Query, không bị copy lại vào `useState`/store khác
116
+ - [ ] `queryKey` lấy từ factory tập trung, không viết tay rải rác
117
+ - [ ] Bảng/list dữ liệu lớn dùng TanStack Table/Virtual thay vì tự viết + render toàn bộ DOM
118
+ - [ ] Form nhiều field dùng TanStack Form (hoặc RHF nếu đã có sẵn), không rời rạc `useState`
119
+ - [ ] Route params/search có type-safe qua TanStack Router, không parse tay
120
+
121
+ > Ghi chú: Nếu dự án dùng Redux thay vì Context/Zustand, áp dụng thêm quy tắc "không dispatch action trực tiếp trong component con sâu — đi qua thunk/selector có kiểm soát". Redux (nếu có) chỉ nên giữ **client state**; server-state luôn thuộc về React Query.
@@ -4,7 +4,7 @@
4
4
 
5
5
  ---
6
6
 
7
- ## 🔄 [Merged from qk-frontend-architecture]
7
+ ## Referenced by: qk-frontend-architecture (file-placement subset)
8
8
 
9
9
  # Frontend Architecture
10
10
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  # ── Identity ───────────────────────────────────────────────
3
3
  name: qk-fe-api-integration
4
- version: 8.0.0
4
+ version: 8.3.1
5
5
  status: stable
6
6
  description: "Consume API Backend, quản lý State, bind vào UI — tuân thủ kiến trúc Base dự án"
7
7
  platforms: [antigravity, claude-code, cursor, windsurf, kilo-code]
@@ -140,7 +140,7 @@ On missing precondition:
140
140
  **Decision:**
141
141
  ```
142
142
  IF wrapper/client found (e.g., apiClient.ts, axiosInstance.ts)
143
- → Use it. NEVER bypass with raw fetch/axios.
143
+ → Use it. Ưu tiên bọc (wrap) bằng TanStack Query (useQuery/useMutation) nếu có thể. NEVER bypass with raw fetch/axios in components.
144
144
  → Confidence: HIGH → go to Phase 2
145
145
 
146
146
  ELSE IF no wrapper found
@@ -157,20 +157,22 @@ ELSE IF conflicting patterns found (mix of fetch + axios + rtk)
157
157
 
158
158
  ---
159
159
 
160
- ### Phase 2 — Generate Types
160
+ ### Phase 2 — Generate Types & Validation
161
161
 
162
162
  **Steps:**
163
- 1. Parse provided JSON payload → extract all fields with types
164
- 2. Generate TypeScript interface (Request + Response)
165
- 3. Flag any field that could be `null` or optional
163
+ 1. Parse provided JSON payload → extract all fields
164
+ 2. Generate **Zod schema** (`z.object({...})`) for runtime validation
165
+ 3. Export TypeScript interface via inferred Zod type (`export type Response = z.infer<typeof schema>`)
166
+ 4. Flag any field that could be `null` or optional with `.nullable()` or `.optional()`
166
167
 
167
168
  **Decision:**
168
169
  ```
169
170
  IF all fields clearly typed from JSON
171
+ → Khởi tạo Zod schema chính xác.
170
172
  → Confidence: HIGH → go to Phase 3
171
173
 
172
174
  ELSE IF some fields ambiguous (null | undefined)
173
- → Mark as optional (?:) + add comment "// verify with backend"
175
+ → Mark as optional in Zod (`.optional()`) + add comment "// verify with backend"
174
176
  → Confidence: MEDIUM → go to Phase 3
175
177
 
176
178
  ELSE IF nested objects contain mixed null/non-null patterns
@@ -182,10 +184,11 @@ ELSE IF nested objects contain mixed null/non-null patterns
182
184
  ### Phase 3 — Implement Service + UI Binding
183
185
 
184
186
  **Steps:**
185
- 1. Create/update service file (API calls only — no UI logic)
186
- 2. Bind to component: implement Loading state (skeleton/spinner)
187
- 3. Bind Success state: render data using generated types
188
- 4. Bind Error state: handle HTTP errors per table below
187
+ 1. Create/update service file: Viết API fetcher function.
188
+ 2. Viết Custom Hook bọc fetcher function bằng **TanStack Query** (`useQuery` hoặc `useMutation`).
189
+ 3. Bind to component: Dùng các states từ hook (`isLoading`, `isPending`, `isError`, `data`) thay tự tạo `useEffect`.
190
+ 4. Bind Error state: handle HTTP errors per table below.
191
+ 5. Kiểm duyệt ranh giới an toàn (R-SEC-04): Validate dữ liệu API trả về bằng Zod Schema ở (2) trước khi render.
189
192
 
190
193
  **HTTP Error Handling (mandatory for ALL integrations):**
191
194
  ```
@@ -356,25 +359,3 @@ Exit Code: [SUCCESS | PARTIAL | BLOCKED | FAILED]
356
359
 
357
360
  ---
358
361
 
359
- Consume backend API safely in frontend: identify existing client, generate types, implement service layer, and bind to UI with proper states.
360
- Triggered when user needs to integrate a backend API endpoint into a frontend application. Requires JSON payload sample and knowledge of existing API client patterns.
361
- - JSON payload sample (request/response)
362
- - API endpoint specification
363
- - Existing API client path (if any)
364
- - Component to bind (if specified)
365
- - Context graph (for existing patterns)
366
- 1. **Identify:** Find existing API client or confirm need for new one
367
- 2. **Generate:** Create TypeScript interfaces from JSON payload
368
- 3. **Implement:** Build service layer with proper HTTP methods
369
- 4. **Bind:** Connect to UI with Loading/Success/Error states
370
- 5. **Audit:** Verify no hardcoded URLs, no API in JSX, proper error handling
371
- - NEVER bypass existing wrapper with raw fetch/axios
372
- - MUST generate strict TypeScript interfaces (no `any`)
373
- - MUST handle all 3 UI states: Loading, Success, Error
374
- - MUST NOT exceed token_budget (max 3 files, 100 lines each, 1 shell command)
375
- - MUST stop early if confidence threshold reached
376
- - Zero-Trust: Use existing client pattern, never invent new one without approval
377
- - Type Safety: All API responses must have explicit TypeScript types
378
- - Error Handling: All HTTP errors must be handled per mandatory table
379
- - Separation: Service layer only — no API calls in presentational components
380
- ---
@@ -0,0 +1,21 @@
1
+ # Auto-generated from SKILL.md frontmatter
2
+ schema_version: 1
3
+ id: "qk-fe-api-integration"
4
+ version: "8.3.1"
5
+ description: "Consume API Backend, quản lý State, bind vào UI — tuân thủ kiến trúc Base dự án"
6
+ tools:
7
+ - "filesystem"
8
+ - "terminal"
9
+ knowledge:
10
+ owns:
11
+ - "api-integration"
12
+ - "state-management"
13
+ references:
14
+ - "architecture"
15
+ eval:
16
+ scorecard: "evals/scorecard.yaml"
17
+ decision_boundary:
18
+ owns:
19
+ - "qk-fe-api-integration"
20
+ does_not_own: []
21
+ conflicts_with: []
@@ -0,0 +1,29 @@
1
+ name: qk-fe-api-integration-eval
2
+ description: Đánh giá chất lượng tích hợp API vào giao diện Frontend
3
+ version: 8.3.1
4
+ threshold: 85 # Đảm bảo tính toàn vẹn của DTO, UI State và ranh giới bảo mật
5
+
6
+ metrics:
7
+ - id: type_and_validation
8
+ name: Khởi tạo Types và Validation (Zod)
9
+ description: Agent có gen ra Types và Zod schema từ JSON payload mẫu không?
10
+ weight: 30
11
+ criteria:
12
+ - Khởi tạo chính xác Zod Schema và xuất TypeScript interfaces (15đ)
13
+ - Phân biệt rõ ràng các trường bắt buộc và tùy chọn (.optional(), .nullable()) (15đ)
14
+
15
+ - id: architecture_compliance
16
+ name: Tuân thủ Kiến trúc dự án (Base Architecture)
17
+ description: Agent có tái sử dụng API Client có sẵn không?
18
+ weight: 30
19
+ criteria:
20
+ - Ưu tiên dùng wrapper có sẵn (Axios/TanStack Query) thay vì viết raw fetch tràn lan (15đ)
21
+ - Tuyệt đối không hardcode Base URL vào trong component (15đ)
22
+
23
+ - id: ui_state_handling
24
+ name: Xử lý State giao diện toàn diện
25
+ description: Có bao phủ đủ 3 trạng thái Loading, Success, Error không?
26
+ weight: 40
27
+ criteria:
28
+ - Xử lý mượt mà trạng thái Loading và Success (20đ)
29
+ - Có cơ chế bắt lỗi HTTP bài bản (401, 404, 500, Network Error) và map với Error state của giao diện (20đ)