ai-developer-skill-os 9.3.0 → 10.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 (185) hide show
  1. package/.agents/AGENTS.md +60 -40
  2. package/.agents/DEV_PROFILE.md +36 -2
  3. package/.agents/registry/graph.json +95 -342
  4. package/.agents/registry/index.yaml +61 -237
  5. package/.agents/rules/coding.md +30 -12
  6. package/.agents/rules/command-safety.md +19 -8
  7. package/.agents/rules/global.md +234 -28
  8. package/.agents/rules/prompt-compiler.md +170 -0
  9. package/.agents/skills/qk-api-data-discovery/SKILL.md +470 -0
  10. package/.agents/skills/qk-backend-data/SKILL.md +190 -0
  11. package/.agents/skills/qk-bug-resolution/SKILL.md +176 -248
  12. package/.agents/skills/qk-code-cleaner/SKILL.md +250 -0
  13. package/.agents/skills/qk-code-review/SKILL.md +126 -247
  14. package/.agents/skills/qk-devops-release/SKILL.md +145 -0
  15. package/.agents/skills/qk-feature-delivery/SKILL.md +179 -247
  16. package/.agents/skills/qk-orchestrator/SKILL.md +100 -151
  17. package/.agents/skills/qk-product-spec/SKILL.md +113 -0
  18. package/.agents/skills/qk-prompt-compiler/SKILL.md +321 -0
  19. package/.agents/skills/qk-ui-engineer/SKILL.md +137 -0
  20. package/.agents/workflows/feature-delivery.yml +1 -1
  21. package/.agents/workflows/production-release.yml +1 -1
  22. package/.agents/workflows/spec-driven-development.yml +109 -87
  23. package/CHANGELOG.md +54 -0
  24. package/README.md +125 -184
  25. package/bin/install.js +337 -329
  26. package/package.json +2 -2
  27. package/.agents/README.md +0 -90
  28. package/.agents/docs/CHI_TIET_SKILLS.md +0 -126
  29. package/.agents/docs/HUONG_DAN_SU_DUNG.md +0 -120
  30. package/.agents/docs/MIGRATION-CLEANUP-V8.1.3.md +0 -36
  31. package/.agents/docs/MIGRATION-STATUS.md +0 -35
  32. package/.agents/docs/MIGRATION-V8.md +0 -10
  33. package/.agents/docs/ROADMAP-V8.2.md +0 -78
  34. package/.agents/docs/V8-CERTIFICATION.md +0 -27
  35. package/.agents/skills/qk-access-policy/SKILL.md +0 -206
  36. package/.agents/skills/qk-access-policy/capability.yaml +0 -23
  37. package/.agents/skills/qk-access-policy/evals/scorecard.yaml +0 -36
  38. package/.agents/skills/qk-agent-observability/SKILL.md +0 -108
  39. package/.agents/skills/qk-agent-observability/capability.yaml +0 -29
  40. package/.agents/skills/qk-agent-observability/evals/scorecard.yaml +0 -29
  41. package/.agents/skills/qk-agent-observability/references/scorecard.yaml +0 -80
  42. package/.agents/skills/qk-ai-builder/SKILL.md +0 -254
  43. package/.agents/skills/qk-ai-builder/capability.yaml +0 -23
  44. package/.agents/skills/qk-ai-builder/evals/scorecard.yaml +0 -30
  45. package/.agents/skills/qk-api-consumer/SKILL.md +0 -256
  46. package/.agents/skills/qk-api-consumer/capability.yaml +0 -21
  47. package/.agents/skills/qk-api-consumer/evals/scorecard.yaml +0 -29
  48. package/.agents/skills/qk-api-lifecycle/SKILL.md +0 -251
  49. package/.agents/skills/qk-api-lifecycle/capability.yaml +0 -23
  50. package/.agents/skills/qk-api-lifecycle/evals/scorecard.yaml +0 -29
  51. package/.agents/skills/qk-bug-resolution/capability.yaml +0 -25
  52. package/.agents/skills/qk-code-review/capability.yaml +0 -23
  53. package/.agents/skills/qk-context-loader/SKILL.md +0 -198
  54. package/.agents/skills/qk-context-loader/capability.yaml +0 -23
  55. package/.agents/skills/qk-context-loader/evals/scorecard.yaml +0 -28
  56. package/.agents/skills/qk-data-engineer/SKILL.md +0 -253
  57. package/.agents/skills/qk-data-lifecycle/SKILL.md +0 -197
  58. package/.agents/skills/qk-data-lifecycle/capability.yaml +0 -23
  59. package/.agents/skills/qk-data-lifecycle/evals/scorecard.yaml +0 -29
  60. package/.agents/skills/qk-db-optimizer/SKILL.md +0 -210
  61. package/.agents/skills/qk-db-optimizer/capability.yaml +0 -22
  62. package/.agents/skills/qk-db-optimizer/evals/scorecard.yaml +0 -28
  63. package/.agents/skills/qk-design-system-engineering/SKILL.md +0 -193
  64. package/.agents/skills/qk-design-system-engineering/capability.yaml +0 -25
  65. package/.agents/skills/qk-design-system-engineering/evals/scorecard.yaml +0 -27
  66. package/.agents/skills/qk-devops-platform/SKILL.md +0 -198
  67. package/.agents/skills/qk-devops-platform/capability.yaml +0 -29
  68. package/.agents/skills/qk-devops-platform/evals/scorecard.yaml +0 -28
  69. package/.agents/skills/qk-docs/SKILL.md +0 -193
  70. package/.agents/skills/qk-docs/capability.yaml +0 -23
  71. package/.agents/skills/qk-docs/evals/scorecard.yaml +0 -27
  72. package/.agents/skills/qk-engineering-standard/SKILL.md +0 -89
  73. package/.agents/skills/qk-engineering-standard/capability.yaml +0 -23
  74. package/.agents/skills/qk-engineering-standard/evals/scorecard.yaml +0 -28
  75. package/.agents/skills/qk-engineering-standard/references/anti-patterns.md +0 -121
  76. package/.agents/skills/qk-engineering-standard/rules/backend.md +0 -122
  77. package/.agents/skills/qk-engineering-standard/rules/database.md +0 -3
  78. package/.agents/skills/qk-engineering-standard/rules/frontend.md +0 -152
  79. package/.agents/skills/qk-engineering-standard/rules/security.md +0 -3
  80. package/.agents/skills/qk-engineering-standard/rules/testing.md +0 -3
  81. package/.agents/skills/qk-fe-api-integration/SKILL.md +0 -704
  82. package/.agents/skills/qk-fe-api-integration/capability.yaml +0 -21
  83. package/.agents/skills/qk-fe-api-integration/evals/scorecard.yaml +0 -29
  84. package/.agents/skills/qk-feature-delivery/capability.yaml +0 -24
  85. package/.agents/skills/qk-frontend-architecture/SKILL.md +0 -127
  86. package/.agents/skills/qk-frontend-architecture/capability.yaml +0 -28
  87. package/.agents/skills/qk-frontend-architecture/evals/scorecard.yaml +0 -28
  88. package/.agents/skills/qk-help/SKILL.md +0 -107
  89. package/.agents/skills/qk-help/capability.yaml +0 -20
  90. package/.agents/skills/qk-help/evals/scorecard.yaml +0 -13
  91. package/.agents/skills/qk-orchestrator/capability.yaml +0 -22
  92. package/.agents/skills/qk-product-specification/SKILL.md +0 -187
  93. package/.agents/skills/qk-product-specification/capability.yaml +0 -27
  94. package/.agents/skills/qk-product-specification/evals/scorecard.yaml +0 -27
  95. package/.agents/skills/qk-production-release/SKILL.md +0 -188
  96. package/.agents/skills/qk-production-release/capability.yaml +0 -27
  97. package/.agents/skills/qk-production-release/evals/scorecard.yaml +0 -28
  98. package/.agents/skills/qk-project-audit/SKILL.md +0 -174
  99. package/.agents/skills/qk-project-bootstrap/SKILL.md +0 -372
  100. package/.agents/skills/qk-project-bootstrap/capability.yaml +0 -23
  101. package/.agents/skills/qk-project-bootstrap/evals/scorecard.yaml +0 -28
  102. package/.agents/skills/qk-project-health/SKILL.md +0 -202
  103. package/.agents/skills/qk-project-health/capability.yaml +0 -23
  104. package/.agents/skills/qk-project-health/evals/scorecard.yaml +0 -27
  105. package/.agents/skills/qk-project-memory/SKILL.md +0 -303
  106. package/.agents/skills/qk-project-memory/capability.yaml +0 -23
  107. package/.agents/skills/qk-project-memory/evals/scorecard.yaml +0 -27
  108. package/.agents/skills/qk-refactor/SKILL.md +0 -243
  109. package/.agents/skills/qk-refactor/capability.yaml +0 -26
  110. package/.agents/skills/qk-refactor/evals/scorecard.yaml +0 -27
  111. package/.agents/skills/qk-security-audit/SKILL.md +0 -280
  112. package/.agents/skills/qk-security-audit/capability.yaml +0 -29
  113. package/.agents/skills/qk-security-audit/evals/scorecard.yaml +0 -27
  114. package/.agents/skills/qk-system-evolution/SKILL.md +0 -625
  115. package/.agents/skills/qk-system-evolution/capability.yaml +0 -24
  116. package/.agents/skills/qk-system-evolution/evals/scorecard.yaml +0 -26
  117. package/.agents/skills/qk-test-engineering/SKILL.md +0 -215
  118. package/.agents/skills/qk-test-engineering/capability.yaml +0 -28
  119. package/.agents/skills/qk-test-engineering/evals/scorecard.yaml +0 -26
  120. package/.agents/skills/qk-ui-audit/SKILL.md +0 -175
  121. package/.agents/skills/qk-ui-audit/capability.yaml +0 -23
  122. package/.agents/skills/qk-ui-audit/evals/scorecard.yaml +0 -26
  123. package/.agents/skills/qk-ui-audit/references/anti-slop-checklist.md +0 -136
  124. package/.agents/skills/qk-ui-builder/SKILL.md +0 -521
  125. package/.agents/skills/qk-ui-builder/capability.yaml +0 -29
  126. package/.agents/skills/qk-ui-builder/evals/scorecard.yaml +0 -26
  127. package/.agents/skills/qk-ui-builder/references/anti-patterns.md +0 -295
  128. package/.agents/skills/qk-ui-builder/references/color.md +0 -115
  129. package/.agents/skills/qk-ui-builder/references/component-cookbook.md +0 -458
  130. package/.agents/skills/qk-ui-builder/references/copy.md +0 -250
  131. package/.agents/skills/qk-ui-builder/references/interaction-and-states.md +0 -115
  132. package/.agents/skills/qk-ui-builder/references/layout-and-space.md +0 -111
  133. package/.agents/skills/qk-ui-builder/references/macrostructures/01-bento-grid.md +0 -48
  134. package/.agents/skills/qk-ui-builder/references/macrostructures/02-long-document.md +0 -50
  135. package/.agents/skills/qk-ui-builder/references/macrostructures/03-marquee-hero.md +0 -51
  136. package/.agents/skills/qk-ui-builder/references/macrostructures/04-stat-led.md +0 -49
  137. package/.agents/skills/qk-ui-builder/references/macrostructures/05-workbench.md +0 -44
  138. package/.agents/skills/qk-ui-builder/references/macrostructures/06-conversational-faq.md +0 -50
  139. package/.agents/skills/qk-ui-builder/references/macrostructures/07-manifesto.md +0 -51
  140. package/.agents/skills/qk-ui-builder/references/macrostructures/08-photographic.md +0 -50
  141. package/.agents/skills/qk-ui-builder/references/macrostructures/09-quote-led.md +0 -50
  142. package/.agents/skills/qk-ui-builder/references/macrostructures/11-catalogue.md +0 -49
  143. package/.agents/skills/qk-ui-builder/references/macrostructures/12-letter.md +0 -49
  144. package/.agents/skills/qk-ui-builder/references/macrostructures/13-index-first.md +0 -49
  145. package/.agents/skills/qk-ui-builder/references/macrostructures/14-narrative-workflow.md +0 -48
  146. package/.agents/skills/qk-ui-builder/references/macrostructures/15-split-studio.md +0 -48
  147. package/.agents/skills/qk-ui-builder/references/macrostructures/16-feature-stack.md +0 -51
  148. package/.agents/skills/qk-ui-builder/references/macrostructures/17-type-specimen.md +0 -48
  149. package/.agents/skills/qk-ui-builder/references/macrostructures/18-portfolio-grid.md +0 -48
  150. package/.agents/skills/qk-ui-builder/references/macrostructures/19-map-diagram.md +0 -50
  151. package/.agents/skills/qk-ui-builder/references/macrostructures/20-ecosystem-index.md +0 -48
  152. package/.agents/skills/qk-ui-builder/references/macrostructures/21-component-playground.md +0 -45
  153. package/.agents/skills/qk-ui-builder/references/macrostructures.md +0 -38
  154. package/.agents/skills/qk-ui-builder/references/motion.md +0 -95
  155. package/.agents/skills/qk-ui-builder/references/responsive.md +0 -115
  156. package/.agents/skills/qk-ui-builder/references/slop-test.md +0 -135
  157. package/.agents/skills/qk-ui-builder/references/structure.md +0 -280
  158. package/.agents/skills/qk-ui-builder/references/themes/atmospheric.md +0 -53
  159. package/.agents/skills/qk-ui-builder/references/themes/carnival.md +0 -52
  160. package/.agents/skills/qk-ui-builder/references/themes/cobalt.md +0 -52
  161. package/.agents/skills/qk-ui-builder/references/themes/editorial.md +0 -52
  162. package/.agents/skills/qk-ui-builder/references/themes/garden.md +0 -52
  163. package/.agents/skills/qk-ui-builder/references/themes/hum.md +0 -52
  164. package/.agents/skills/qk-ui-builder/references/themes/lumen.md +0 -52
  165. package/.agents/skills/qk-ui-builder/references/themes/midnight.md +0 -52
  166. package/.agents/skills/qk-ui-builder/references/themes/modern-minimal.md +0 -52
  167. package/.agents/skills/qk-ui-builder/references/themes/playful.md +0 -52
  168. package/.agents/skills/qk-ui-builder/references/themes/specimen.md +0 -52
  169. package/.agents/skills/qk-ui-builder/references/themes/terminal.md +0 -52
  170. package/.agents/skills/qk-ui-builder/references/typography.md +0 -129
  171. package/.agents/skills/qk-ui-system-builder/SKILL.md +0 -183
  172. package/.agents/skills/qk-ui-system-builder/capability.yaml +0 -25
  173. package/.agents/skills/qk-ui-system-builder/evals/scorecard.yaml +0 -26
  174. package/.agents/skills/qk-upgrade/SKILL.md +0 -301
  175. package/.agents/skills/qk-upgrade/capability.yaml +0 -24
  176. package/.agents/skills/qk-upgrade/evals/scorecard.yaml +0 -26
  177. package/.agents/skills/qk-validation-gate/SKILL.md +0 -88
  178. package/.agents/skills/qk-validation-gate/capability.yaml +0 -23
  179. package/.agents/skills/qk-validation-gate/evals/scorecard.yaml +0 -26
  180. package/.agents/skills/qk-web-quality-gate/SKILL.md +0 -197
  181. package/.agents/skills/qk-web-quality-gate/capability.yaml +0 -24
  182. package/.agents/skills/qk-web-quality-gate/evals/scorecard.yaml +0 -26
  183. package/.agents/workflows/research.yml +0 -75
  184. package/.agents/workflows/skill-evolution.yml +0 -97
  185. package/tooling/fix-refactor.js +0 -8
@@ -1,121 +0,0 @@
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.
@@ -1,122 +0,0 @@
1
- # Backend Rules
2
-
3
- - Define rules here.
4
-
5
- ---
6
-
7
- ## 🔄 [Merged from qk-backend-architecture]
8
-
9
- # Backend Architecture
10
-
11
- > **Language rule:**
12
- > Use English for: code, identifiers, file names, architecture terms, technical decisions.
13
- > Use the user's language for: explanations, questions, summaries, and feedback.
14
- > The user may write in any language — detect and match it automatically.
15
-
16
- ---
17
-
18
- ## Trigger
19
-
20
- Activate this skill when:
21
- - Creating new backend API endpoints, services, or models
22
- - User asks "where should I put this business logic?"
23
- - Project audit flags mixed concerns (e.g., SQL queries inside a controller)
24
- - Inheriting or setting up a Node.js, Python, or Go backend
25
-
26
- ---
27
-
28
- ## Scope
29
-
30
- - ✅ Discover existing backend folder structure
31
- - ✅ Enforce Layered Architecture (Controller → Service → Data Access)
32
- - ✅ Enforce Domain/Module-based structure if applicable (`src/users/`, `src/orders/`)
33
- - ✅ Define where validation, mapping, and error handling should live
34
- - ✅ Validate file placement before code generation
35
-
36
- ---
37
-
38
- ## Non-goals
39
-
40
- - ❌ Do NOT rewrite the architecture unless requested
41
- - ❌ Do NOT write the actual database queries (delegate to `database-engineer`)
42
- - ❌ Do NOT configure server infrastructure (delegate to `deployment`)
43
-
44
- ---
45
-
46
- ## Severity Levels
47
-
48
- | Level | Meaning |
49
- |-------|---------|
50
- | P0 | Circular dependency or security bypass in architecture |
51
- | P1 | Mixed concerns (e.g., ORM logic in route handler) |
52
- | P2 | Inconsistent folder or file naming |
53
- | P3 | Minor deviation from convention |
54
-
55
- ---
56
-
57
- ## Workflow
58
-
59
- ### Phase 1 — Architecture Discovery
60
-
61
- Analyze the project structure:
62
- 1. **Classic MVC / Layered:** `controllers/`, `services/`, `models/`, `routes/`
63
- 2. **Domain-Driven (Module):** `src/modules/user/{controller, service, repository}`
64
- 3. **Framework-specific:** NestJS (`.controller.ts`, `.service.ts`), Django apps, Express monolithic.
65
- 4. **Serverless:** `functions/`, `handlers/`
66
-
67
- ---
68
-
69
- ### Phase 2 — Rule Extraction
70
-
71
- Extract conventions:
72
- - **Routes/Controllers:** Should only handle HTTP req/res, params validation, and calling services. No business logic.
73
- - **Services:** Pure business logic. Does not know about HTTP (`req`/`res`).
74
- - **Repositories/Data Access:** Only layer that interacts with the DB.
75
- - **Error Handling:** Centralized error middleware vs local try/catch.
76
-
77
- ---
78
-
79
- ### Phase 3 — File Placement & Routing
80
-
81
- Map a new requirement to the architecture:
82
-
83
- *Request: "Add an endpoint to update user profile"*
84
- - Route: `PUT /api/users/:id` mapped in `src/routes/user.routes.ts`
85
- - Controller: `updateProfile(req, res)` in `src/controllers/user.controller.ts`
86
- - Service: `updateUserProfile(userId, data)` in `src/services/user.service.ts`
87
-
88
- ---
89
-
90
- ## Decision Tree
91
-
92
- ```
93
- Does the project group files by Layer or by Domain?
94
- ├── Layer → Place in `src/controllers/` and `src/services/`
95
- └── Domain → Place in `src/modules/users/`
96
-
97
- Where does data validation happen?
98
- ├── Middleware → Add Zod/Joi validation at the router level
99
- └── Controller → Validate inside the controller function before calling service
100
- ```
101
-
102
- ---
103
-
104
- ## Output Format
105
-
106
- ```
107
- 🏗️ Backend Architecture Plan
108
- ─────────────────────────────────────────────────
109
- Structure Type: [Layered / Domain-based / Framework-specific]
110
-
111
- Layer Mapping:
112
- ✅ Controller: [path/to/controller.ts] — handles HTTP
113
- ✅ Service: [path/to/service.ts] — business logic
114
- ✅ Repo/DB: [handled by database-engineer]
115
-
116
- ⚠️ Constraints enforced:
117
- • Do not pass `req` or `res` objects into the Service layer.
118
- • Validate all inputs at the Controller/Route level.
119
-
120
- 🔗 Next Steps:
121
- Proceeding to implement the layers.
122
- ```
@@ -1,3 +0,0 @@
1
- # Database Rules
2
-
3
- - Define rules here.
@@ -1,152 +0,0 @@
1
- # Frontend Rules
2
-
3
- - Define rules here.
4
-
5
- ---
6
-
7
- ## Referenced by: qk-frontend-architecture (file-placement subset)
8
-
9
- # Frontend Architecture
10
-
11
- > **Language rule:**
12
- > Use English for: code, identifiers, file names, architecture terms, technical decisions.
13
- > Use the user's language for: explanations, questions, summaries, and feedback.
14
- > The user may write in any language — detect and match it automatically.
15
-
16
- ---
17
-
18
- ## Trigger
19
-
20
- Activate this skill when:
21
- - About to create new files or components
22
- - User asks "where should I put this file?" or "how should I organize this?"
23
- - Moving or refactoring code across different modules
24
- - Inheriting an unfamiliar frontend project
25
-
26
- ---
27
-
28
- ## Scope
29
-
30
- - ✅ Discover the existing frontend folder structure
31
- - ✅ Define where new components, hooks, services, and types should be placed
32
- - ✅ Enforce separation of concerns (e.g., UI vs. Business Logic vs. Data)
33
- - ✅ Identify architectural patterns in use (e.g., Feature-based, Layer-based)
34
- - ✅ Validate file placement before execution by other skills
35
-
36
- ---
37
-
38
- ## Non-goals
39
-
40
- - ❌ Do NOT rewrite the entire project architecture unless explicitly asked
41
- - ❌ Do NOT generate code (delegate to `component-generator` or `ui-builder`)
42
- - ❌ Do NOT enforce personal preferences over established project conventions
43
-
44
- ---
45
-
46
- ## Severity Levels
47
-
48
- | Level | Meaning |
49
- |-------|---------|
50
- | P0 | Architectural violation that breaks the build or creates circular dependencies |
51
- | P1 | File placed in completely wrong layer (e.g., API logic in UI component) |
52
- | P2 | Inconsistent folder or file naming |
53
- | P3 | Minor deviation from convention |
54
-
55
- ---
56
-
57
- ## Workflow
58
-
59
- ### Phase 1 — Structure Discovery
60
-
61
- *(Relies on `context-manager` if already loaded)*
62
-
63
- Analyze the root source directory (e.g., `src/`, `app/`):
64
- 1. **Layer-based:** `components/`, `hooks/`, `services/`, `utils/`, `types/`
65
- 2. **Feature-based:** `features/auth/`, `features/products/`
66
- 3. **Framework-specific:** `app/` (Next.js App Router), `pages/` (Next.js Pages Router, Nuxt)
67
- 4. **Domain-driven:** `domains/user/`, `domains/payment/`
68
- 5. **FSD (Feature Sliced Design):** `app/`, `processes/`, `pages/`, `widgets/`, `features/`, `entities/`, `shared/`
69
-
70
- ---
71
-
72
- ### Phase 2 — Rule Extraction
73
-
74
- Based on discovery, define the project's rules for:
75
- - **Components:** Are they flat? Grouped by feature? Atomic design?
76
- - **Hooks:** Shared in `src/hooks/` or collocated with components?
77
- - **State:** Global store vs. feature stores?
78
- - **API/Services:** Where are HTTP calls made?
79
- - **Types:** Centralized `types/` or collocated?
80
- - **Naming Conventions:** PascalCase, camelCase, kebab-case, `index.ts` usage?
81
-
82
- ---
83
-
84
- ### Phase 3 — File Placement Decision
85
-
86
- When a new feature/component is requested, map it to the structure:
87
-
88
- **Input:** "Create a User Profile card that fetches user data."
89
- **Decision:**
90
- - UI Component: `src/features/user/components/UserProfileCard.tsx`
91
- - API Hook: `src/features/user/api/useUser.ts`
92
- - Types: `src/features/user/types/index.ts`
93
-
94
- ---
95
-
96
- ### Phase 4 — Enforcement & Validation
97
-
98
- Before passing control to a generation skill (like `ui-builder`), ensure the plan adheres to the rules.
99
-
100
- - [ ] Does it mix concerns? (e.g., putting an API call directly in a shared UI button)
101
- - [ ] Does it violate import boundaries? (e.g., a shared component importing from a specific feature)
102
- - [ ] Is the naming consistent?
103
-
104
- ---
105
-
106
- ## Decision Tree
107
-
108
- ```
109
- Is the project using a Feature-based structure?
110
- ├── Yes → Place feature-specific code in `features/<feature-name>/`
111
- └── No → Use Layer-based structure (`components/`, `hooks/`, etc.)
112
-
113
- Is the code shared across multiple domains/features?
114
- ├── Yes → Place in `shared/` or global `components/` / `hooks/`
115
- └── No → Collocate with the specific domain/feature
116
-
117
- Are there existing examples of this type of file?
118
- ├── Yes → Copy their placement and naming pattern
119
- └── No → Propose a standard location and ask user to confirm
120
- ```
121
-
122
- ---
123
-
124
- ## Output Format
125
-
126
- ```
127
- 🏗️ Frontend Architecture Plan
128
- ─────────────────────────────────────────────────
129
- Structure Type: [Feature-based / Layer-based / FSD / etc.]
130
- Naming: [PascalCase for components, camelCase for functions]
131
-
132
- File Placement:
133
- 📄 [path/to/new/file1.tsx] — [Why it goes here]
134
- 📄 [path/to/new/file2.ts] — [Why it goes here]
135
-
136
- ⚠️ Constraints enforced:
137
- • [Constraint 1, e.g., "API calls must be in hooks, not components"]
138
- • [Constraint 2, e.g., "Shared UI components cannot import from features/"]
139
-
140
- 🔗 Next Steps:
141
- Delegating to `[skill-name]` to generate the files.
142
- ```
143
-
144
- ---
145
-
146
- ## Validation Checklist
147
-
148
- - [ ] Structure type identified correctly
149
- - [ ] File placement follows existing conventions
150
- - [ ] Naming matches project standards
151
- - [ ] Separation of concerns maintained
152
- - [ ] Plan ready to be executed by generation skills
@@ -1,3 +0,0 @@
1
- # Security Rules
2
-
3
- - Define rules here.
@@ -1,3 +0,0 @@
1
- # Testing Rules
2
-
3
- - Define rules here.