ai-developer-skill-os 9.3.1 → 10.2.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.
- package/.agents/AGENTS.md +73 -40
- package/.agents/DEV_PROFILE.md +36 -2
- package/.agents/LICENSE +21 -21
- package/.agents/docs/ARCHITECTURE.md +56 -120
- package/.agents/docs/GOVERNANCE.md +3 -3
- package/.agents/docs/SPEC.md +137 -60
- package/.agents/docs/VERSIONING.md +25 -57
- package/.agents/docs/adr/0005-v10-platform-consolidation.md +50 -0
- package/.agents/docs/schemas/learning.schema.yml +22 -57
- package/.agents/docs/schemas/skill.schema.yml +116 -161
- package/.agents/docs/schemas/workflow.schema.yml +51 -26
- package/.agents/docs/skill-classification.md +1 -1
- package/.agents/registry/graph.json +193 -346
- package/.agents/registry/index.yaml +90 -233
- package/.agents/rules/coding.md +30 -12
- package/.agents/rules/command-safety.md +20 -9
- package/.agents/rules/global.md +234 -28
- package/.agents/rules/prompt-compiler.md +170 -0
- package/.agents/rules/safety.md +1 -1
- package/.agents/rules/security.md +1 -1
- package/.agents/rules/skill-quality.md +18 -3
- package/.agents/skills/_template/SKILL.md +238 -88
- package/.agents/skills/qk-api-data-discovery/SKILL.md +456 -0
- package/.agents/skills/qk-api-data-discovery/references/bronze-record-format.md +47 -0
- package/.agents/skills/qk-api-data-discovery/references/data-contract-yaml.md +72 -0
- package/.agents/skills/qk-api-data-discovery/references/discovery-report-template.md +110 -0
- package/.agents/skills/qk-backend-data/SKILL.md +339 -0
- package/.agents/skills/qk-bug-resolution/SKILL.md +328 -248
- package/.agents/skills/qk-bug-resolution/evals/scorecard.yaml +1 -1
- package/.agents/skills/qk-code-cleaner/SKILL.md +399 -0
- package/.agents/skills/qk-code-review/SKILL.md +320 -247
- package/.agents/skills/qk-code-review/evals/scorecard.yaml +1 -1
- package/.agents/skills/qk-code-review/references/ai/{v8-schema-validation.md → schema-validation.md} +2 -2
- package/.agents/skills/qk-code-review/references/cross-cutting/async-concurrency-patterns.md +515 -515
- package/.agents/skills/qk-code-review/references/cross-cutting/error-handling-principles.md +492 -492
- package/.agents/skills/qk-code-review/references/cross-cutting/n-plus-one-queries.md +309 -309
- package/.agents/skills/qk-code-review/references/cross-cutting/sql-injection-prevention.md +307 -307
- package/.agents/skills/qk-code-review/references/cross-cutting/xss-prevention.md +263 -263
- package/.agents/skills/qk-code-review/references/languages/angular.md +768 -768
- package/.agents/skills/qk-code-review/references/languages/c.md +890 -890
- package/.agents/skills/qk-code-review/references/languages/cpp.md +893 -893
- package/.agents/skills/qk-code-review/references/languages/css-less-sass.md +661 -661
- package/.agents/skills/qk-code-review/references/languages/django.md +985 -985
- package/.agents/skills/qk-code-review/references/languages/fastapi.md +580 -580
- package/.agents/skills/qk-code-review/references/languages/go.md +993 -993
- package/.agents/skills/qk-code-review/references/languages/java.md +409 -409
- package/.agents/skills/qk-code-review/references/languages/java8.md +586 -586
- package/.agents/skills/qk-code-review/references/languages/kotlin.md +1018 -1018
- package/.agents/skills/qk-code-review/references/languages/nestjs.md +593 -593
- package/.agents/skills/qk-code-review/references/languages/php.md +684 -684
- package/.agents/skills/qk-code-review/references/languages/python.md +1073 -1073
- package/.agents/skills/qk-code-review/references/languages/qt.md +757 -757
- package/.agents/skills/qk-code-review/references/languages/react.md +871 -871
- package/.agents/skills/qk-code-review/references/languages/ruby.md +964 -964
- package/.agents/skills/qk-code-review/references/languages/rust.md +846 -846
- package/.agents/skills/qk-code-review/references/languages/svelte.md +1064 -1064
- package/.agents/skills/qk-code-review/references/languages/swift.md +936 -936
- package/.agents/skills/qk-code-review/references/languages/typescript.md +1016 -1016
- package/.agents/skills/qk-code-review/references/languages/vue.md +924 -924
- package/.agents/skills/qk-code-review/references/languages/zig.md +440 -440
- package/.agents/skills/qk-devops-release/SKILL.md +294 -0
- package/.agents/skills/qk-feature-delivery/SKILL.md +331 -247
- package/.agents/skills/qk-feature-delivery/evals/scorecard.yaml +1 -1
- package/.agents/skills/qk-orchestrator/SKILL.md +286 -152
- package/.agents/skills/qk-orchestrator/evals/scorecard.yaml +1 -1
- package/.agents/skills/qk-orchestrator/references/routing-table.md +1 -1
- package/.agents/skills/qk-product-spec/SKILL.md +262 -0
- package/.agents/skills/qk-prompt-compiler/SKILL.md +444 -0
- package/.agents/skills/qk-ui-engineer/SKILL.md +286 -0
- package/.agents/workflows/_schema.yml +146 -146
- package/.agents/workflows/bug-resolution.yml +155 -121
- package/.agents/workflows/code-review.yml +127 -93
- package/.agents/workflows/context-discovery.yml +128 -94
- package/.agents/workflows/documentation.yml +124 -90
- package/.agents/workflows/feature-delivery.yml +158 -124
- package/.agents/workflows/production-release.yml +207 -173
- package/.agents/workflows/prompt-compilation.yml +126 -0
- package/.agents/workflows/refactor.yml +136 -102
- package/.agents/workflows/security-audit.yml +149 -115
- package/.agents/workflows/shared/quality-gate.yml +3 -1
- package/.agents/workflows/skin-governance.yml +149 -115
- package/.agents/workflows/spec-driven-development.yml +116 -87
- package/CHANGELOG.md +77 -0
- package/README.md +125 -205
- package/bin/install.js +324 -329
- package/package.json +68 -74
- package/tooling/build-registry.js +226 -208
- package/tooling/run-aar.js +55 -126
- package/tooling/sync-versions.js +2 -2
- package/tooling/validate-graph.js +100 -87
- package/tooling/validate-skills.js +32 -14
- package/.agents/README.md +0 -90
- package/.agents/docs/CHI_TIET_SKILLS.md +0 -126
- package/.agents/docs/HUONG_DAN_SU_DUNG.md +0 -120
- package/.agents/docs/MIGRATION-CLEANUP-V8.1.3.md +0 -36
- package/.agents/docs/MIGRATION-STATUS.md +0 -35
- package/.agents/docs/MIGRATION-V8.md +0 -10
- package/.agents/docs/ROADMAP-V8.2.md +0 -78
- package/.agents/docs/V8-CERTIFICATION.md +0 -27
- package/.agents/docs/decisions/ADR-001-v8-migration.md +0 -58
- package/.agents/docs/decisions/ADR-002-workflow-separation.md +0 -50
- package/.agents/docs/decisions/ADR-003-registry-generated.md +0 -54
- package/.agents/docs/decisions/ADR-008-skill-boundary-review.md +0 -27
- package/.agents/registry/capability-graph.yml +0 -390
- package/.agents/registry/skills-index.yml +0 -305
- package/.agents/skills/_template/capability.yaml +0 -34
- package/.agents/skills/_template/evals/scorecard.yaml +0 -19
- package/.agents/skills/qk-access-policy/SKILL.md +0 -206
- package/.agents/skills/qk-access-policy/capability.yaml +0 -23
- package/.agents/skills/qk-access-policy/evals/scorecard.yaml +0 -36
- package/.agents/skills/qk-agent-observability/SKILL.md +0 -108
- package/.agents/skills/qk-agent-observability/capability.yaml +0 -29
- package/.agents/skills/qk-agent-observability/evals/scorecard.yaml +0 -29
- package/.agents/skills/qk-agent-observability/references/scorecard.yaml +0 -80
- package/.agents/skills/qk-ai-builder/SKILL.md +0 -254
- package/.agents/skills/qk-ai-builder/capability.yaml +0 -23
- package/.agents/skills/qk-ai-builder/evals/scorecard.yaml +0 -30
- package/.agents/skills/qk-api-consumer/SKILL.md +0 -256
- package/.agents/skills/qk-api-consumer/capability.yaml +0 -21
- package/.agents/skills/qk-api-consumer/evals/scorecard.yaml +0 -29
- package/.agents/skills/qk-api-lifecycle/SKILL.md +0 -251
- package/.agents/skills/qk-api-lifecycle/capability.yaml +0 -23
- package/.agents/skills/qk-api-lifecycle/evals/scorecard.yaml +0 -29
- package/.agents/skills/qk-bug-resolution/capability.yaml +0 -25
- package/.agents/skills/qk-code-review/capability.yaml +0 -23
- package/.agents/skills/qk-context-loader/SKILL.md +0 -198
- package/.agents/skills/qk-context-loader/capability.yaml +0 -23
- package/.agents/skills/qk-context-loader/evals/scorecard.yaml +0 -28
- package/.agents/skills/qk-data-engineer/SKILL.md +0 -253
- package/.agents/skills/qk-data-lifecycle/SKILL.md +0 -197
- package/.agents/skills/qk-data-lifecycle/capability.yaml +0 -23
- package/.agents/skills/qk-data-lifecycle/evals/scorecard.yaml +0 -29
- package/.agents/skills/qk-db-optimizer/SKILL.md +0 -210
- package/.agents/skills/qk-db-optimizer/capability.yaml +0 -22
- package/.agents/skills/qk-db-optimizer/evals/scorecard.yaml +0 -28
- package/.agents/skills/qk-design-system-engineering/SKILL.md +0 -193
- package/.agents/skills/qk-design-system-engineering/capability.yaml +0 -25
- package/.agents/skills/qk-design-system-engineering/evals/scorecard.yaml +0 -27
- package/.agents/skills/qk-devops-platform/SKILL.md +0 -198
- package/.agents/skills/qk-devops-platform/capability.yaml +0 -29
- package/.agents/skills/qk-devops-platform/evals/scorecard.yaml +0 -28
- package/.agents/skills/qk-docs/SKILL.md +0 -193
- package/.agents/skills/qk-docs/capability.yaml +0 -23
- package/.agents/skills/qk-docs/evals/scorecard.yaml +0 -27
- package/.agents/skills/qk-engineering-standard/SKILL.md +0 -89
- package/.agents/skills/qk-engineering-standard/capability.yaml +0 -23
- package/.agents/skills/qk-engineering-standard/evals/scorecard.yaml +0 -28
- package/.agents/skills/qk-engineering-standard/references/anti-patterns.md +0 -121
- package/.agents/skills/qk-engineering-standard/rules/backend.md +0 -122
- package/.agents/skills/qk-engineering-standard/rules/database.md +0 -3
- package/.agents/skills/qk-engineering-standard/rules/frontend.md +0 -152
- package/.agents/skills/qk-engineering-standard/rules/security.md +0 -3
- package/.agents/skills/qk-engineering-standard/rules/testing.md +0 -3
- package/.agents/skills/qk-fe-api-integration/SKILL.md +0 -704
- package/.agents/skills/qk-fe-api-integration/capability.yaml +0 -21
- package/.agents/skills/qk-fe-api-integration/evals/scorecard.yaml +0 -29
- package/.agents/skills/qk-feature-delivery/capability.yaml +0 -24
- package/.agents/skills/qk-frontend-architecture/SKILL.md +0 -127
- package/.agents/skills/qk-frontend-architecture/capability.yaml +0 -28
- package/.agents/skills/qk-frontend-architecture/evals/scorecard.yaml +0 -28
- package/.agents/skills/qk-help/SKILL.md +0 -107
- package/.agents/skills/qk-help/capability.yaml +0 -20
- package/.agents/skills/qk-help/evals/scorecard.yaml +0 -13
- package/.agents/skills/qk-orchestrator/capability.yaml +0 -22
- package/.agents/skills/qk-product-specification/SKILL.md +0 -187
- package/.agents/skills/qk-product-specification/capability.yaml +0 -27
- package/.agents/skills/qk-product-specification/evals/scorecard.yaml +0 -27
- package/.agents/skills/qk-production-release/SKILL.md +0 -188
- package/.agents/skills/qk-production-release/capability.yaml +0 -27
- package/.agents/skills/qk-production-release/evals/scorecard.yaml +0 -28
- package/.agents/skills/qk-project-audit/SKILL.md +0 -174
- package/.agents/skills/qk-project-bootstrap/SKILL.md +0 -372
- package/.agents/skills/qk-project-bootstrap/capability.yaml +0 -23
- package/.agents/skills/qk-project-bootstrap/evals/scorecard.yaml +0 -28
- package/.agents/skills/qk-project-health/SKILL.md +0 -202
- package/.agents/skills/qk-project-health/capability.yaml +0 -23
- package/.agents/skills/qk-project-health/evals/scorecard.yaml +0 -27
- package/.agents/skills/qk-project-memory/SKILL.md +0 -303
- package/.agents/skills/qk-project-memory/capability.yaml +0 -23
- package/.agents/skills/qk-project-memory/evals/scorecard.yaml +0 -27
- package/.agents/skills/qk-refactor/SKILL.md +0 -243
- package/.agents/skills/qk-refactor/capability.yaml +0 -26
- package/.agents/skills/qk-refactor/evals/scorecard.yaml +0 -27
- package/.agents/skills/qk-security-audit/SKILL.md +0 -280
- package/.agents/skills/qk-security-audit/capability.yaml +0 -29
- package/.agents/skills/qk-security-audit/evals/scorecard.yaml +0 -27
- package/.agents/skills/qk-system-evolution/SKILL.md +0 -625
- package/.agents/skills/qk-system-evolution/capability.yaml +0 -24
- package/.agents/skills/qk-system-evolution/evals/scorecard.yaml +0 -26
- package/.agents/skills/qk-test-engineering/SKILL.md +0 -215
- package/.agents/skills/qk-test-engineering/capability.yaml +0 -28
- package/.agents/skills/qk-test-engineering/evals/scorecard.yaml +0 -26
- package/.agents/skills/qk-ui-audit/SKILL.md +0 -175
- package/.agents/skills/qk-ui-audit/capability.yaml +0 -23
- package/.agents/skills/qk-ui-audit/evals/scorecard.yaml +0 -26
- package/.agents/skills/qk-ui-audit/references/anti-slop-checklist.md +0 -136
- package/.agents/skills/qk-ui-builder/SKILL.md +0 -521
- package/.agents/skills/qk-ui-builder/capability.yaml +0 -29
- package/.agents/skills/qk-ui-builder/evals/scorecard.yaml +0 -26
- package/.agents/skills/qk-ui-builder/references/anti-patterns.md +0 -295
- package/.agents/skills/qk-ui-builder/references/color.md +0 -115
- package/.agents/skills/qk-ui-builder/references/component-cookbook.md +0 -458
- package/.agents/skills/qk-ui-builder/references/copy.md +0 -250
- package/.agents/skills/qk-ui-builder/references/interaction-and-states.md +0 -115
- package/.agents/skills/qk-ui-builder/references/layout-and-space.md +0 -111
- package/.agents/skills/qk-ui-builder/references/macrostructures/01-bento-grid.md +0 -48
- package/.agents/skills/qk-ui-builder/references/macrostructures/02-long-document.md +0 -50
- package/.agents/skills/qk-ui-builder/references/macrostructures/03-marquee-hero.md +0 -51
- package/.agents/skills/qk-ui-builder/references/macrostructures/04-stat-led.md +0 -49
- package/.agents/skills/qk-ui-builder/references/macrostructures/05-workbench.md +0 -44
- package/.agents/skills/qk-ui-builder/references/macrostructures/06-conversational-faq.md +0 -50
- package/.agents/skills/qk-ui-builder/references/macrostructures/07-manifesto.md +0 -51
- package/.agents/skills/qk-ui-builder/references/macrostructures/08-photographic.md +0 -50
- package/.agents/skills/qk-ui-builder/references/macrostructures/09-quote-led.md +0 -50
- package/.agents/skills/qk-ui-builder/references/macrostructures/11-catalogue.md +0 -49
- package/.agents/skills/qk-ui-builder/references/macrostructures/12-letter.md +0 -49
- package/.agents/skills/qk-ui-builder/references/macrostructures/13-index-first.md +0 -49
- package/.agents/skills/qk-ui-builder/references/macrostructures/14-narrative-workflow.md +0 -48
- package/.agents/skills/qk-ui-builder/references/macrostructures/15-split-studio.md +0 -48
- package/.agents/skills/qk-ui-builder/references/macrostructures/16-feature-stack.md +0 -51
- package/.agents/skills/qk-ui-builder/references/macrostructures/17-type-specimen.md +0 -48
- package/.agents/skills/qk-ui-builder/references/macrostructures/18-portfolio-grid.md +0 -48
- package/.agents/skills/qk-ui-builder/references/macrostructures/19-map-diagram.md +0 -50
- package/.agents/skills/qk-ui-builder/references/macrostructures/20-ecosystem-index.md +0 -48
- package/.agents/skills/qk-ui-builder/references/macrostructures/21-component-playground.md +0 -45
- package/.agents/skills/qk-ui-builder/references/macrostructures.md +0 -38
- package/.agents/skills/qk-ui-builder/references/motion.md +0 -95
- package/.agents/skills/qk-ui-builder/references/responsive.md +0 -115
- package/.agents/skills/qk-ui-builder/references/slop-test.md +0 -135
- package/.agents/skills/qk-ui-builder/references/structure.md +0 -280
- package/.agents/skills/qk-ui-builder/references/themes/atmospheric.md +0 -53
- package/.agents/skills/qk-ui-builder/references/themes/carnival.md +0 -52
- package/.agents/skills/qk-ui-builder/references/themes/cobalt.md +0 -52
- package/.agents/skills/qk-ui-builder/references/themes/editorial.md +0 -52
- package/.agents/skills/qk-ui-builder/references/themes/garden.md +0 -52
- package/.agents/skills/qk-ui-builder/references/themes/hum.md +0 -52
- package/.agents/skills/qk-ui-builder/references/themes/lumen.md +0 -52
- package/.agents/skills/qk-ui-builder/references/themes/midnight.md +0 -52
- package/.agents/skills/qk-ui-builder/references/themes/modern-minimal.md +0 -52
- package/.agents/skills/qk-ui-builder/references/themes/playful.md +0 -52
- package/.agents/skills/qk-ui-builder/references/themes/specimen.md +0 -52
- package/.agents/skills/qk-ui-builder/references/themes/terminal.md +0 -52
- package/.agents/skills/qk-ui-builder/references/typography.md +0 -129
- package/.agents/skills/qk-ui-system-builder/SKILL.md +0 -183
- package/.agents/skills/qk-ui-system-builder/capability.yaml +0 -25
- package/.agents/skills/qk-ui-system-builder/evals/scorecard.yaml +0 -26
- package/.agents/skills/qk-upgrade/SKILL.md +0 -301
- package/.agents/skills/qk-upgrade/capability.yaml +0 -24
- package/.agents/skills/qk-upgrade/evals/scorecard.yaml +0 -26
- package/.agents/skills/qk-validation-gate/SKILL.md +0 -88
- package/.agents/skills/qk-validation-gate/capability.yaml +0 -23
- package/.agents/skills/qk-validation-gate/evals/scorecard.yaml +0 -26
- package/.agents/skills/qk-web-quality-gate/SKILL.md +0 -197
- package/.agents/skills/qk-web-quality-gate/capability.yaml +0 -24
- package/.agents/skills/qk-web-quality-gate/evals/scorecard.yaml +0 -26
- package/.agents/workflows/research.yml +0 -75
- package/.agents/workflows/skill-evolution.yml +0 -97
- 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,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
|