openmoneta-dev-kit 1.9.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 (46) hide show
  1. package/README.md +103 -0
  2. package/agents/qa-autonomous.md +131 -0
  3. package/agents/requirement-analyst.md +98 -0
  4. package/agents/security-auditor.md +120 -0
  5. package/agents/ui-tester.md +186 -0
  6. package/bin/openmoneta.js +11 -0
  7. package/hooks/check-plan-exists.sh +154 -0
  8. package/hooks/enforce-docs-first.sh +169 -0
  9. package/hooks/inject-process-context.sh +117 -0
  10. package/hooks/track-changes.sh +46 -0
  11. package/hooks/verify-completion.sh +165 -0
  12. package/hooks.json +30 -0
  13. package/opencode/AGENTS.md.tpl +38 -0
  14. package/opencode/agents/qa-autonomous.md +42 -0
  15. package/opencode/agents/requirement-analyst.md +51 -0
  16. package/opencode/agents/security-auditor.md +46 -0
  17. package/opencode/agents/ui-tester.md +43 -0
  18. package/opencode/plugins/openmoneta-guard.ts +389 -0
  19. package/package.json +41 -0
  20. package/scripts/debug-hooks.sh +54 -0
  21. package/scripts/init-project.sh +438 -0
  22. package/scripts/list-affected-modules.sh +74 -0
  23. package/skills/auth-bypass-testing/SKILL.md +236 -0
  24. package/skills/automated-testing/SKILL.md +162 -0
  25. package/skills/automated-testing/scripts/install-playwright.sh +134 -0
  26. package/skills/module-architect/SKILL.md +256 -0
  27. package/skills/plan-writer/SKILL.md +229 -0
  28. package/skills/requirement-analysis/SKILL.md +163 -0
  29. package/skills/safe-push/SKILL.md +182 -0
  30. package/skills/security-checklist/SKILL.md +116 -0
  31. package/skills/test-strategy/SKILL.md +135 -0
  32. package/skills/ui-test-loop/SKILL.md +161 -0
  33. package/src/cli.js +63 -0
  34. package/src/commands/check.js +30 -0
  35. package/src/commands/init.js +43 -0
  36. package/src/commands/install.js +50 -0
  37. package/src/commands/uninstall.js +74 -0
  38. package/src/commands/update.js +81 -0
  39. package/src/lib/paths.js +46 -0
  40. package/src/lib/version.js +45 -0
  41. package/templates/AGENTS.md.tpl +106 -0
  42. package/templates/docs-INDEX.md.tpl +62 -0
  43. package/templates/env.test.tpl +16 -0
  44. package/templates/karpathy-reference.md +49 -0
  45. package/templates/plans-INDEX.md.tpl +38 -0
  46. package/templates/playwright.config.ts.tpl +44 -0
@@ -0,0 +1,256 @@
1
+ ---
2
+ name: module-architect
3
+ description: Quy tắc chia module theo SRP (1 module = 1 trách nhiệm, có README riêng) + workflow update README sau khi sửa code. KHÔNG đếm dòng để tách. Dùng ở Bước 2 (thiết kế) và Bước 5 (update doc) của quy trình 6 bước.
4
+ ---
5
+
6
+ # Module Architect
7
+
8
+ Skill này phụ trách 2 trách nhiệm của quy trình 6 bước:
9
+
10
+ - **Bước 2 — Thiết kế**: chia module theo SRP, quyết định khi nào cần module mới.
11
+ - **Bước 5 — Update doc**: sync `README.md` của module sau khi code đổi (đã merge từ skill `doc-maintainer` cũ).
12
+
13
+ Mục tiêu chung: cấu trúc code dễ navigate cho cả người và AI, tiết kiệm token khi đọc.
14
+
15
+ ## Phần 1 — Thiết kế module (Bước 2)
16
+
17
+ ### Nguyên tắc cốt lõi
18
+
19
+ #### 1. Single Responsibility
20
+
21
+ Mỗi module trả lời được câu: "Module này làm gì?" trong 1 câu, KHÔNG có chữ "và".
22
+
23
+ - ✅ "Xử lý xác thực JWT cho API requests"
24
+ - ❌ "Xử lý JWT và quản lý session và send email" (3 trách nhiệm → 3 module)
25
+
26
+ #### 2. Tránh "lò xo" — tách khi vi phạm SRP, KHÔNG vì đếm dòng
27
+
28
+ > **KHÔNG** có hard rule về số dòng. Câu hỏi đúng KHÔNG phải "file này bao nhiêu dòng?" mà là "file này đang làm bao nhiêu việc khác nhau?". 1 file 800 dòng làm 1 việc = OK. 1 file 200 dòng làm 4 việc = tách.
29
+
30
+ Khi nào cân nhắc tách (theo SRP):
31
+
32
+ - File mô tả được trong 1 câu KHÔNG có chữ "và" → đang OK, không cần tách dù dài.
33
+ - File phải có chữ "và" để mô tả → SRP violation → tách (dù 100 dòng).
34
+ - File khó đặt tên ngắn gọn → mơ hồ trách nhiệm → tách.
35
+
36
+ Khi nào IGNORE rule (không tách dù dài):
37
+
38
+ - Generated code (Prisma client, GraphQL schema, OpenAPI types).
39
+ - Pure types/constants/schemas (không có logic).
40
+ - Test fixtures, seed data.
41
+ - Config files (webpack, playwright, biome, ...).
42
+ - File có cohesion cực cao (vd 1 state machine 500 dòng cho 1 workflow rõ ràng).
43
+
44
+ #### 3. Mỗi module có `README.md` riêng (3 sections, lean)
45
+
46
+ ```markdown
47
+ # <Tên module>
48
+
49
+ **Trách nhiệm**: <1 câu, không có chữ "và">
50
+
51
+ ## Public API
52
+
53
+ - `funcA(arg1: X, arg2: Y): Z` — mô tả 1 dòng
54
+ - `class Foo` — mô tả 1 dòng
55
+
56
+ ## Dependencies
57
+
58
+ - Internal: `modules/auth`, `modules/db`
59
+ - External: `axios`, `zod`
60
+ ```
61
+
62
+ > Chỉ 3 sections. KHÔNG thêm Owner/Stability/Cách dùng/Anti-patterns vào README mặc định — chúng dễ stale và AI hiếm khi dùng. Nếu module có quirk đặc biệt (vd phải init theo thứ tự), thêm section `## Lưu ý` ngắn ≤5 bullet.
63
+
64
+ ### Cấu trúc folder mẫu
65
+
66
+ ```
67
+ src/modules/<module-name>/
68
+ ├── README.md # Bắt buộc (3 sections)
69
+ ├── index.ts # Public API (re-export)
70
+ ├── types.ts # TypeScript types/interfaces
71
+ ├── <core>.ts # Logic chính
72
+ ├── <helpers>.ts # Helpers nội bộ (không export)
73
+ └── __tests__/
74
+ └── <core>.test.ts
75
+ ```
76
+
77
+ ### Dependency rules
78
+
79
+ - Module **CHỈ** import từ:
80
+ - Public API của module khác (qua `index.ts`)
81
+ - External packages
82
+ - KHÔNG import file nội bộ của module khác (vd: `modules/auth/internals/foo.ts`).
83
+ - KHÔNG có circular dependency. Phát hiện → tách common module mới.
84
+
85
+ ### Khi nào tách module (đã có)
86
+
87
+ Tách khi xảy ra ít nhất 1 (đều là **SRP signal**):
88
+
89
+ - Module thay đổi vì >2 lý do business khác nhau.
90
+ - 2 phần của module có lifecycle deploy/release khác nhau.
91
+ - 2 phần có owner/team khác nhau.
92
+ - Mô tả trách nhiệm phải dùng chữ "và".
93
+ - Test setup của 2 phần khác xa nhau.
94
+
95
+ ### Khi nào TẠO module mới (BẮT BUỘC, không nhét vào module cũ)
96
+
97
+ > Mục tiêu: cô lập sửa code, giảm xung đột. Mỗi feature mới gần như luôn xứng đáng có module riêng.
98
+
99
+ Trigger ép tạo module mới (đều là **SRP/concept signal**):
100
+
101
+ 1. **Feature mới có concept business riêng** (vd: "Notifications" — gửi email/push/SMS) → tạo module `notifications/`. KHÔNG nhét vào `utils/` / `common/` / `shared/`.
102
+ 2. **Sửa module cũ thêm trách nhiệm thứ 2** vi phạm SRP → tách trách nhiệm mới ra module riêng.
103
+ 3. **Code mới không thuộc trách nhiệm rõ ràng của module nào hiện có** → tạo module riêng tên theo concept business.
104
+ 4. **2 feature dùng chung logic non-trivial** → extract ra module `<concept>/`, không paste duplicate.
105
+
106
+ #### Anti-pattern (TUYỆT ĐỐI tránh)
107
+
108
+ - Nhét code mới vào `utils/` / `common/` / `helpers/` / `shared/` "cho tiện".
109
+ - Đặt tên module generic kiểu `core`, `lib`, `misc` — bắt buộc tên theo **concept business** (`auth`, `billing`, `notifications`, `tenant`, ...).
110
+ - Tạo module mới cho 1 utility nhỏ trivial (vd: 1 hàm `formatDate`) → gộp vào module gần nhất có cùng concept.
111
+
112
+ ### Workflow khi feature mới
113
+
114
+ Trước khi viết code, ở Bước 2 plan:
115
+
116
+ 1. Feature này thuộc **concept business** nào? Đặt tên module candidate.
117
+ 2. Search `docs/INDEX.md` (bảng "Modules hiện có" + "Token Routing") xem module đó đã có chưa.
118
+ 3. **CHƯA có** + thỏa ≥1 trigger trên → tạo `docs/modules/<new-slug>/README.md` (3 sections) + tạo source folder tương ứng.
119
+ 4. **ĐÃ có** → check section "Trách nhiệm": feature mới có khớp 1 câu trách nhiệm không? Khớp → reuse. Không khớp → tạo module mới.
120
+
121
+ ## Phần 2 — Workflow cho dự án EXISTING (BẮT BUỘC trước khi sang Bước 3)
122
+
123
+ > Khi vào dự án **đã có code sẵn** (không khởi tạo bằng `init-project.sh`), AI thường bỏ sót Bước 2 vì code đã tồn tại. Workflow sau bắt buộc chạy 1 lần đầu cho mỗi dự án existing.
124
+
125
+ ### Bước 2.0 — Auto-detect module có sẵn
126
+
127
+ ```bash
128
+ # Monorepo (apps/ + packages/)
129
+ ls apps/ 2>/dev/null | sed 's|^|apps/|'
130
+ ls packages/ 2>/dev/null | sed 's|^|packages/|'
131
+
132
+ # Single-repo (src/modules/)
133
+ ls src/modules/ 2>/dev/null | sed 's|^|src/modules/|'
134
+
135
+ # Fallback
136
+ ls src/ 2>/dev/null | sed 's|^|src/|'
137
+ ```
138
+
139
+ ### Bước 2.1 — Map module thực → folder docs
140
+
141
+ Quy ước slug:
142
+
143
+ | File path mẫu | Module slug | Docs path |
144
+ |---|---|---|
145
+ | `apps/landing/src/...` | `apps-landing` | `docs/modules/apps-landing/` |
146
+ | `packages/tenant/src/...` | `packages-tenant` | `docs/modules/packages-tenant/` |
147
+ | `src/modules/auth/...` | `auth` | `docs/modules/auth/` |
148
+ | `src/auth/...` (single-repo, không có `modules/`) | `auth` | `docs/modules/auth/` |
149
+
150
+ > Helper: `bash ~/.cursor/scripts/list-affected-modules.sh .cursor/.session-changes.json` infer slug từ file đã sửa.
151
+
152
+ ### Bước 2.2 — Backfill khi chạm vào module chưa có docs
153
+
154
+ Khi plan sẽ sửa module mà `docs/modules/<slug>/` **chưa tồn tại**:
155
+
156
+ 1. Tạo `docs/modules/<slug>/README.md` với 3 sections (Trách nhiệm + Public API + Dependencies). Đọc `package.json` + entry point của module để fill nội dung.
157
+ 2. **Cập nhật `docs/INDEX.md`**:
158
+ - Thêm dòng vào bảng "Modules hiện có".
159
+ - **BẮT BUỘC: thêm 3-5 keyword (VN+EN) vào bảng "Feature/Keyword → Module"** để hook `enforce-docs-first` + Bước 1 token-aware reading hoạt động hiệu quả. Vd module `auth` keyword: "đăng nhập, login, OAuth, JWT, session, authentication".
160
+
161
+ ### Bước 2.3 — Token Routing maintenance (CRITICAL)
162
+
163
+ > Bảng "Feature/Keyword → Module" trong `docs/INDEX.md` là **tim của hệ thống token-aware**. Stale → AI không tìm được module → đọc loạn → tốn token.
164
+
165
+ Quy tắc maintenance:
166
+
167
+ - **Tạo module mới** → thêm dòng + 3-5 keyword (VN+EN).
168
+ - **Đổi tên module** → update slug trong cột "Module liên quan".
169
+ - **Xóa module** → xóa dòng + check không có file nào còn ref module đó.
170
+ - **Module mở rộng concept** (vd `auth` thêm SSO) → thêm keyword mới vào dòng đã có.
171
+
172
+ ## Phần 3 — Update README sau code đổi (Bước 5, merge từ doc-maintainer)
173
+
174
+ > Đây là phần đuôi tự nhiên của Bước 2 — module đã thiết kế xong, code đã sửa, giờ sync README để session sau AI đọc lại không bị lệch.
175
+
176
+ ### Bước 5 workflow — Sync module README (BẮT BUỘC)
177
+
178
+ > Hook `verify-completion` Check 6 sẽ **CHẶN** session kết thúc nếu module bị sửa nhưng không có `docs/modules/<slug>/README.md`.
179
+
180
+ **Cách xác định module từ file path** (cho file đã sửa trong session):
181
+
182
+ | File path mẫu | Module slug | Docs path |
183
+ |---|---|---|
184
+ | `apps/landing/src/x.ts` | `apps-landing` | `docs/modules/apps-landing/` |
185
+ | `packages/tenant/src/y.ts` | `packages-tenant` | `docs/modules/packages-tenant/` |
186
+ | `src/modules/auth/z.ts` | `auth` | `docs/modules/auth/` |
187
+ | `src/auth/z.ts` (no `modules/`) | `auth` | `docs/modules/auth/` |
188
+
189
+ > Helper script: `bash ~/.cursor/scripts/list-affected-modules.sh .cursor/.session-changes.json`.
190
+
191
+ **Workflow cho mỗi module slug**:
192
+
193
+ 1. Nếu `docs/modules/<slug>/` **chưa tồn tại** → backfill theo Bước 2.2 ở trên.
194
+ 2. Mở `docs/modules/<slug>/README.md`.
195
+ 3. Check section **Public API**:
196
+ - Có function/class mới đã export? → thêm vào.
197
+ - Có function/class bị xóa hoặc đổi signature? → update/xóa.
198
+ 4. Check section **Dependencies**:
199
+ - Có `import` mới từ module khác? → thêm.
200
+ - Có `import` bị xóa? → xóa.
201
+ 5. Nếu module **mới được backfill** ở Bước 2.2 → đảm bảo `docs/INDEX.md` đã có trong bảng "Modules hiện có" + Token Routing.
202
+
203
+ > KHÔNG cần update `changelog.md` cấp module — v1.5.0 bỏ enforcement này. Lịch sử dùng `git log` thay.
204
+
205
+ ### Anti-patterns
206
+
207
+ - ❌ Copy nguyên block code vào README (sẽ stale).
208
+ - ❌ Viết tutorial dài dòng — README chỉ cần Public API list.
209
+ - ❌ Không update Token Routing khi tạo module mới → AI sẽ không tìm thấy.
210
+ - ❌ Viết "TODO: update later" → KHÔNG defer, làm ngay.
211
+ - ❌ Viết bằng tiếng Anh khi project rule là tiếng Việt.
212
+
213
+ ### Checklist trước khi đánh dấu Bước 5 xong
214
+
215
+ - [ ] Module README đã sync với public API thực tế (nếu API đổi).
216
+ - [ ] Module mới được tạo → đã thêm vào bảng "Modules hiện có" + Token Routing trong `docs/INDEX.md`.
217
+ - [ ] Plan đánh dấu `Status: Done`.
218
+ - [ ] Plan file đã `git mv` sang `plans/archive/<file>.md` (auto-archive).
219
+ - [ ] `plans/INDEX.md` đã chuyển plan từ Active sang Archived.
220
+
221
+ ## Anti-overengineering checklist (Karpathy #2)
222
+
223
+ > Tham khảo: [`templates/karpathy-reference.md`](../../templates/karpathy-reference.md) — nguyên tắc "Simplicity First".
224
+
225
+ Trước khi commit code, tự hỏi từng câu. **CÓ → simplify trước commit:**
226
+
227
+ - [ ] Code có abstraction (interface / abstract class / Protocol) chỉ có **1 implementation** không?
228
+ - [ ] Có class với suffix `Factory` / `Manager` / `Helper` / `Service` mà chỉ wrap 1 function không?
229
+ - [ ] Có config / option / flag không được yêu cầu, "phòng khi sau cần" không?
230
+ - [ ] Có error handling cho case **không thể xảy ra** trong contract hiện tại không?
231
+ - [ ] Code 100+ dòng cho task có thể giải bằng 30 dòng không?
232
+ - [ ] Senior engineer review sẽ nói "overcomplicated" không?
233
+
234
+ Nếu CÓ ≥1 câu → rewrite đơn giản hơn TRƯỚC khi commit.
235
+
236
+ ### Pattern cấm trừ khi user yêu cầu rõ
237
+
238
+ - Generic types phức tạp (`Result<Either<Maybe<T>, E>>`) cho code không cần generic.
239
+ - Plugin system / strategy pattern khi chỉ có 1 strategy.
240
+ - Event bus / pub-sub cho 2 component giao tiếp.
241
+ - Dependency injection container cho < 5 dependency.
242
+ - Cache layer cho data đọc < 10 lần / giờ.
243
+ - Wrapper class chỉ để rename method của lib bên ngoài.
244
+
245
+ ### Pattern CHO PHÉP
246
+
247
+ - Test fixture / mock có abstraction (vì test cần variation).
248
+ - Public library API (cần stable interface, dù chỉ 1 internal impl).
249
+ - Khi user yêu cầu rõ và có lý do business cụ thể.
250
+ - Validate input của user (input validation ≠ handle impossible).
251
+
252
+ ### Quy tắc 200 → 50
253
+
254
+ Sau khi viết xong implementation, đọc lại:
255
+ - Có thể giảm xuống 50% dòng mà vẫn đủ chức năng + đủ test pass không?
256
+ - Nếu có → rewrite. Code ngắn hơn = ít bug hơn + dễ maintain hơn.
@@ -0,0 +1,229 @@
1
+ ---
2
+ name: plan-writer
3
+ description: Adaptive planning cho quy trình 6 bước. Task nhỏ có thể không cần plan. Task lớn/rủi ro phải tạo repo plan trong plans/YYYY-MM-DD-<slug>.md với Status: Draft, trình user review, chỉ triển khai sau khi user approve và đổi Status: In Progress.
4
+ ---
5
+
6
+ # Plan Writer
7
+
8
+ Đây là **Bước 3** của quy trình 6 bước. Từ v1.7.0, plan là **adaptive**:
9
+
10
+ - Task nhỏ/rõ ràng: có thể không cần plan, Agent triển khai luôn.
11
+ - Task lớn/rủi ro: BẮT BUỘC tạo repo plan với `Status: Draft`, trình user review, chỉ code sau khi user approve và đổi `Status: In Progress`.
12
+ - Nếu đã có plan `In Progress`: hook `check-plan-exists` enforce file scope.
13
+ - Nếu có plan `Draft`: hook chặn code edit để bảo đảm user review trước triển khai.
14
+
15
+ Hook `verify-completion` Check 9 sẽ CHẶN session kết thúc nếu plan không có section "## Hiểu yêu cầu" (audit trail clarify).
16
+
17
+ ## Naming convention
18
+
19
+ ```
20
+ plans/YYYY-MM-DD-<slug-kebab-case>.md
21
+ ```
22
+
23
+ - `YYYY-MM-DD`: ngày tạo plan (theo local timezone).
24
+ - `<slug>`: ngắn gọn, mô tả tính năng/fix chính. Ví dụ: `add-google-login`, `fix-cart-overflow`, `refactor-payment-service`.
25
+ ## Khi nào cần plan?
26
+
27
+ ### Không cần plan (Agent làm luôn)
28
+
29
+ Chỉ áp dụng khi TẤT CẢ điều kiện đúng:
30
+ - ≤1-2 file thường.
31
+ - Diff nhỏ, không đổi public API.
32
+ - Yêu cầu rõ, không có nhiều hướng triển khai.
33
+ - Không chạm dữ liệu nhạy cảm, auth, payment, admin, permission, database, migration, deploy.
34
+ - Không tạo/xóa nhiều file, không refactor lớn.
35
+
36
+ Ví dụ: fix typo, đổi text UI nhỏ, sửa CSS rõ ràng, update docs nhỏ, đổi 1 hằng số.
37
+
38
+ ### Bắt buộc tạo plan + user review
39
+
40
+ Tạo plan nếu có BẤT KỲ dấu hiệu nào:
41
+ - Task mơ hồ hoặc có nhiều hướng triển khai.
42
+ - Đụng >2 file code hoặc >1 module.
43
+ - Refactor, migration, schema/database.
44
+ - Auth/OAuth/session/token/secret/security.
45
+ - Payment/billing/checkout/subscription.
46
+ - Admin/permission/RBAC/role.
47
+ - Deploy/infra/CI/CD/git flow.
48
+ - Public API change hoặc nguy cơ regression.
49
+ - User yêu cầu "lên kế hoạch", "plan", "thiết kế", "phân tích kỹ".
50
+
51
+ Plan tạo trong Agent mode phải dừng ở `Status: Draft` để user review.
52
+
53
+ ## Review gate bắt buộc
54
+
55
+ Khi tạo plan:
56
+ 1. Tạo file trong `plans/YYYY-MM-DD-<slug>.md`.
57
+ 2. Set `**Status**: Draft`.
58
+ 3. Trình bày tóm tắt plan cho user.
59
+ 4. Hỏi user bằng `AskQuestion`:
60
+ - Approve plan và triển khai.
61
+ - Sửa plan.
62
+ - Hủy plan.
63
+ - Làm nhanh không cần plan (chỉ cho task không nhạy cảm).
64
+ 5. Chỉ khi user approve: đổi `Status: In Progress`, rồi mới edit code.
65
+
66
+ Không được tự tạo plan rồi tự approve.
67
+
68
+ ## Template chuẩn (5 sections)
69
+
70
+ ```markdown
71
+ # <Tiêu đề plan ngắn gọn>
72
+
73
+ **Status**: Draft | In Progress | Done
74
+ **Created**: YYYY-MM-DD HH:mm
75
+ **Tiny**: no | yes (≤1 file, ≤20 dòng diff, không tạo/xóa file)
76
+
77
+ ## Hiểu yêu cầu
78
+
79
+ > BẮT BUỘC. Hook `verify-completion` Check 9 chặn nếu trống.
80
+
81
+ **Câu hỏi đã hỏi user** (skip nếu task trivial):
82
+ - Q: <câu hỏi> → A: <user trả lời>
83
+
84
+ HOẶC
85
+
86
+ **Lý do skip clarify**: <vd: "user spec đầy đủ trong message", "fix typo rõ ràng từ screenshot">
87
+
88
+ ## Mục tiêu
89
+
90
+ <1-2 câu: làm gì, vì sao>
91
+
92
+ ## Modules ảnh hưởng
93
+
94
+ > Hook `verify-completion` Check 6 sẽ chặn nếu module ở đây không có README. Quy ước slug xem skill `module-architect` Bước 2.1.
95
+
96
+ | Module | Docs path | Trạng thái | Files thay đổi (subset) |
97
+ |---|---|---|---|
98
+ | `apps-landing` | `docs/modules/apps-landing/` | có sẵn | `apps/landing/src/middleware.ts` |
99
+ | `notifications` | `docs/modules/notifications/` | NEW | `src/modules/notifications/email.ts` |
100
+ | `legacy-cart` | `docs/modules/legacy-cart/` | backfill | `src/cart/checkout.ts` |
101
+
102
+ Cột "Trạng thái":
103
+ - `có sẵn` — module đã có docs/source.
104
+ - `NEW` — sẽ tạo mới (theo trigger `module-architect` "Khi nào TẠO module mới").
105
+ - `backfill` — module có source nhưng chưa có docs, cần tạo `docs/modules/<slug>/README.md` trước khi sang Bước 4.
106
+
107
+ Quy tắc:
108
+ - Mỗi file ở section "Files ảnh hưởng" PHẢI map về 1 dòng trong bảng này.
109
+ - Plan chỉ đụng `docs/`, `plans/`, `.gitignore`, `.env.example` → có thể bỏ qua section này (hook tự skip).
110
+
111
+ ### Cross-module discipline (>2 module = red flag)
112
+
113
+ Nếu bảng "Modules ảnh hưởng" có **>2 module** → BẮT BUỘC thêm subsection:
114
+
115
+ ```markdown
116
+ ### Lý do cross-module
117
+
118
+ <Vì sao plan này phải đụng N module thay vì cô lập trong 1-2 module?>
119
+
120
+ Đã cân nhắc các option đơn giản hơn:
121
+ - [ ] Có thể giới hạn trong 1-2 module bằng cách thêm public API ở module X? → Không, vì ...
122
+ - [ ] Có thể tách thành nhiều plan nhỏ, mỗi plan 1 module? → Không, vì ...
123
+ - [ ] Có phải đây là cross-cutting concern (logging, telemetry, i18n) không? → ...
124
+ ```
125
+
126
+ Hook `verify-completion` Check 7 (WARN) sẽ cảnh báo nếu session đụng >3 module.
127
+
128
+ ## Files ảnh hưởng
129
+
130
+ > Hook `check-plan-exists` đọc section này. Liệt kê chính xác đường dẫn file sẽ tạo/sửa.
131
+
132
+ - `src/auth/google.ts` (create)
133
+ - `src/components/LoginButton.tsx` (modify)
134
+ - `tests/e2e/login.spec.ts` (create)
135
+
136
+ ## Tasks
137
+
138
+ > **Karpathy #4**: mỗi task PHẢI có verify check cụ thể. Tham khảo: [`templates/karpathy-reference.md`](../../templates/karpathy-reference.md).
139
+
140
+ Format:
141
+
142
+ - [ ] Task 1: <hành động cụ thể> → **Verify**: <lệnh / cách kiểm tra cụ thể>
143
+ - [ ] Task 2: <hành động cụ thể> → **Verify**: <...>
144
+
145
+ Ví dụ tốt:
146
+
147
+ - [ ] Thêm endpoint `POST /api/login` → **Verify**: `curl -X POST localhost:3000/api/login -d '{"email":"x"}' | jq .status` trả `401`
148
+ - [ ] Validate email format → **Verify**: unit test `auth.test.ts::validateEmail` 5 case pass
149
+
150
+ Ví dụ xấu (thiếu verify cụ thể):
151
+
152
+ - [ ] ~~Login chạy được~~ ❌ (không đo được)
153
+ - [ ] ~~Code clean~~ ❌ (vô nghĩa)
154
+ ```
155
+
156
+ ## Plan minimal (chỉ khi vẫn muốn audit cho task nhỏ)
157
+
158
+ **Định nghĩa task nhỏ** (TẤT CẢ điều kiện phải đúng):
159
+ - Edit ≤1 file
160
+ - Diff ≤20 dòng
161
+ - Không tạo file mới
162
+ - Không xóa file
163
+ - Không đổi public API
164
+ - Không đụng auth/payment/PII
165
+
166
+ Vd: fix typo, đổi 1 string i18n, bump version 1 dependency, đổi 1 hằng số.
167
+
168
+ **Template tiny:**
169
+
170
+ ```markdown
171
+ # Fix typo header (tiny)
172
+
173
+ **Status**: Done
174
+ **Created**: 2026-04-23 16:42
175
+ **Tiny**: yes (1 file, 3 dòng)
176
+
177
+ ## Hiểu yêu cầu
178
+
179
+ **Lý do skip clarify**: typo rõ ràng từ screenshot user gửi.
180
+
181
+ ## Files ảnh hưởng
182
+
183
+ - `src/components/Header.tsx` (modify)
184
+ ```
185
+
186
+ Plan minimal là optional. Nếu sau khi sửa thấy vượt ngưỡng (>20 dòng / >1 file / đổi API) → tạo plan đầy đủ và xin user review trước khi tiếp tục.
187
+
188
+ ## Sau khi tạo plan
189
+
190
+ 1. Update `plans/INDEX.md`:
191
+ - Thêm dòng vào bảng "Active" với link và status `Draft`.
192
+ 2. Chờ user review/approve.
193
+ 3. Đổi Status từ `Draft` → `In Progress` sau khi user approve.
194
+ 4. Tick checkbox `[x]` cho mỗi task xong.
195
+ 5. Đổi Status → `Done` ở Bước 5 sau khi update module README xong.
196
+ 6. **AUTO-ARCHIVE**: ngay khi đổi Status → Done, chạy:
197
+ ```bash
198
+ git mv plans/<file>.md plans/archive/<file>.md
199
+ ```
200
+ Update `plans/INDEX.md` (chuyển plan từ Active → Archived). Lý do: giảm noise trong `plans/` để session sau AI scan ít file hơn.
201
+
202
+ ## Hook behavior (v1.7.0)
203
+
204
+ - Không có plan active + file thường → hook allow.
205
+ - Không có plan active + file nhạy cảm/rủi ro cao → hook block và yêu cầu plan.
206
+ - Có plan `Draft` → hook block code edit cho đến khi user approve.
207
+ - Có plan `In Progress` → hook enforce file nằm trong `## Files ảnh hưởng` / `## Files thay đổi`.
208
+
209
+ ## Surgical Changes (Karpathy #3)
210
+
211
+ > Hook chỉ chặn **file** ngoài scope. Tự discipline ở **line-level**:
212
+
213
+ - **Mỗi dòng đổi phải trace về 1 task trong plan này.** Không có task tương ứng → không đổi.
214
+ - KHÔNG "improve" code adjacent: đừng đổi format, comment, tên biến không liên quan task.
215
+ - KHÔNG refactor function chưa hỏng vì plan này. Refactor là task riêng, plan riêng.
216
+ - **Match existing style** (indent, naming, import order).
217
+ - Phát hiện dead code không liên quan → ghi vào section "Notes" của plan, KHÔNG xóa.
218
+
219
+ ## AC ví dụ minh họa (cho task lớn)
220
+
221
+ Task >5 file hoặc breaking change → có thể tự thêm section `## Acceptance Criteria` (optional). Format:
222
+
223
+ **Tốt (đo lường được):**
224
+ - "POST `/api/login` với body `{idToken: string}` trả `200 {user, accessToken}` hoặc `401 {error}`."
225
+ - "Button 'Đăng nhập Google' click mở popup OAuth, success → redirect `/dashboard`, fail → toast lỗi 5s."
226
+
227
+ **Xấu (mơ hồ):**
228
+ - "Login chạy được" ❌
229
+ - "UI đẹp" ❌
@@ -0,0 +1,163 @@
1
+ ---
2
+ name: requirement-analysis
3
+ description: Phân tích yêu cầu user, đọc TOKEN-AWARE docs/INDEX.md (hook enforced), sinh giả thuyết/edge case/rủi ro và đặt câu hỏi critical để làm rõ yêu cầu, phân tích mọi trường hợp có thể xảy ra, phản biện và đề xuất phương án tối ưu hơn nếu có TRƯỚC khi lập plan. Output câu hỏi/trả lời sẽ ghi vào plan section "Hiểu yêu cầu" (verify-completion Check 9 enforce).
4
+ ---
5
+
6
+ # Phân tích yêu cầu
7
+
8
+ Đây là **Bước 1** của quy trình 6 bước. KHÔNG được code/plan khi chưa hoàn tất bước này.
9
+
10
+ > **3 nguyên tắc bất biến của bước này** (theo yêu cầu user):
11
+ > 1. Hỏi clarify TRƯỚC khi plan/code (trừ task trivial → khai báo lý do skip).
12
+ > 2. Đọc doc liên quan + phân tích module/file ảnh hưởng + đánh giá có cần module mới không.
13
+ > 3. Output câu hỏi/trả lời/lý do skip → ghi vào plan section "## Hiểu yêu cầu" (Bước 3).
14
+
15
+ ## Workflow 5 bước con
16
+
17
+ ### Bước 1.1 — Đọc context dự án TOKEN-AWARE (HOOK ENFORCED)
18
+
19
+ > **HOOK ENFORCEMENT (v1.4.3+)**: Hook `enforce-docs-first` sẽ **chặn mọi `Read/Glob/Grep` lên `apps/`, `packages/`, `src/`, `lib/`, `components/`, `server/`, `modules/`** nếu chưa đọc `docs/INDEX.md` trong session. Marker: `<workspace>/.cursor/.docs-index-read` (auto-clean ở mỗi sessionStart).
20
+
21
+ **Đọc 2 file lõi (BẮT BUỘC theo thứ tự)**:
22
+
23
+ 1. **`docs/INDEX.md` ĐẦU TIÊN**:
24
+ - Bảng "Modules hiện có" → danh sách module + responsibility.
25
+ - Bảng "Feature/Keyword → Module (Token Routing)" → map keyword user → module candidate.
26
+ 2. **`plans/INDEX.md`** → check plan active có overlap không (tránh trùng work).
27
+
28
+ ### Bước 1.2 — Map yêu cầu → module candidate
29
+
30
+ - Match keyword trong yêu cầu user với bảng "Token Routing" → 1-3 module candidate.
31
+ - Vd: user nói "thêm Google login" → keyword `auth, login, OAuth, JWT` → module `auth` / `apps-admin-ui`.
32
+ - Nếu không match → đây là feature mới → áp dụng skill `module-architect` Bước "Khi nào TẠO module mới".
33
+
34
+ ### Bước 1.3 — Đọc CHỈ README của module candidate
35
+
36
+ - `docs/modules/<candidate>/README.md` (3 sections: Trách nhiệm, Public API, Dependencies).
37
+ - **KHÔNG đọc** README của module không liên quan.
38
+ - **KHÔNG scan** `docs/architecture/`, `docs/api/`, `docs/security/` trừ khi yêu cầu user trực tiếp đụng đến.
39
+ - Sau khi đọc README → mới được Read/Grep/Glob source code của module đó (hook đã unlock).
40
+
41
+ #### Anti-pattern token waste
42
+
43
+ - ❌ Đọc tất cả `docs/modules/*/README.md` "để hiểu toàn bộ dự án" → 19 module × 30 dòng = ~9k tokens phí phạm.
44
+ - ❌ Đọc `docs/architecture/overview.md` đầy đủ cho task fix bug nhỏ.
45
+ - ❌ `Read` file source code không thuộc module candidate.
46
+
47
+ #### Khi nào ĐƯỢC đọc rộng
48
+
49
+ - User explicit yêu cầu refactor cross-cutting (vd "đổi log format toàn bộ").
50
+ - Task affect ≥3 module → đọc thêm để hiểu dependency.
51
+ - Audit security/performance toàn bộ dự án.
52
+
53
+ ### Bước 1.4 — Liệt kê 3 nhóm + đánh giá module
54
+
55
+ Viết tóm tắt yêu cầu (2-3 câu) **bằng ngôn từ của bạn** + 3 nhóm:
56
+
57
+ ```markdown
58
+ **Tóm tắt yêu cầu**: <2-3 câu>
59
+
60
+ **Module ảnh hưởng** (theo Token Routing + đọc source):
61
+ - `<slug>` (có sẵn / NEW / backfill) — vì sao
62
+ - `<slug>` ...
63
+
64
+ **Giả thuyết** (assume mà chưa chắc):
65
+ - ...
66
+
67
+ **Edge cases** (dễ bị bỏ sót):
68
+ - ...
69
+
70
+ **Rủi ro** (kỹ thuật / business / bảo mật):
71
+ - ...
72
+ ```
73
+
74
+ > Output này sẽ ghi vào `## Hiểu yêu cầu` của plan ở Bước 3.
75
+
76
+ ### Bước 1.5 — Hỏi clarify (BẮT BUỘC, trừ task trivial)
77
+
78
+ > **Nguyên tắc bất biến #1 của user**: AI tự đặt giả thuyết + truy vấn user TRƯỚC khi plan/code. Hook `verify-completion` Check 9 sẽ chặn nếu plan thiếu section "## Hiểu yêu cầu".
79
+
80
+ Dùng tool `AskQuestion`. Quy tắc:
81
+
82
+ - Hỏi câu **critical** — câu trả lời sẽ thay đổi đáng kể plan/implementation.
83
+ - KHÔNG hỏi câu user đã ngầm trả lời trong yêu cầu.
84
+ - KHÔNG hỏi vì sợ sai — hỏi để làm rõ ambiguity thực sự.
85
+ - Mỗi câu nên có **2-4 options cụ thể**, kèm trade-off ngắn.
86
+ - Số lượng câu hỏi tùy thuộc vào độ phức tạp của task. Task phức tạp nhiều ẩn số có thể cần nhiều câu hơn để làm rõ toàn bộ yêu cầu trước khi lập plan.
87
+
88
+ #### Khi nào ĐƯỢC skip clarify (task trivial)
89
+
90
+ - Fix typo rõ ràng (user gửi screenshot / quote chính xác).
91
+ - Bump version 1 dependency theo yêu cầu cụ thể.
92
+ - Đổi 1 hằng số / string i18n theo spec rõ.
93
+ - Format code / lint fix.
94
+ - Rename file/biến theo yêu cầu rõ.
95
+
96
+ → Khi skip, BẮT BUỘC ghi vào plan: `**Lý do skip clarify**: <ngắn gọn>`. Hook Check 9 chấp nhận lý do này.
97
+
98
+ #### Khi nào BẮT BUỘC hỏi (kể cả nghe có vẻ rõ)
99
+
100
+ - Feature mới có ≥2 cách implement với trade-off khác nhau.
101
+ - Thay đổi behavior có thể ảnh hưởng user hiện tại.
102
+ - Đụng auth/payment/PII/permission.
103
+ - Plan có >2 module ảnh hưởng (cross-module).
104
+ - User dùng từ mơ hồ ("cải thiện UI", "tối ưu performance", "refactor service").
105
+
106
+ #### Ví dụ câu hỏi tốt
107
+
108
+ ```
109
+ "Khi user đăng nhập Google fail, behavior nên là gì?"
110
+ - Option A: Hiện modal lỗi + giữ nguyên trang
111
+ - Option B: Redirect về /login với query ?error=
112
+ - Option C: Fallback sang đăng nhập email
113
+ ```
114
+
115
+ #### Ví dụ câu hỏi xấu
116
+
117
+ - "Bạn muốn tôi làm gì?" (quá vague)
118
+ - "Frontend hay backend?" (nên tự suy ra)
119
+ - "Có cần test không?" (test on-demand, hỏi user nếu thật sự cần)
120
+
121
+ ### Bước 1.6 — Đề xuất cách đơn giản hơn (Karpathy #1)
122
+
123
+ > Tham khảo: [`templates/karpathy-reference.md`](../../templates/karpathy-reference.md).
124
+
125
+ Trước khi sang Bước 2, tự hỏi:
126
+
127
+ - Có cách giải quyết bài toán user nêu **đơn giản hơn** không?
128
+ - Nếu **CÓ** → trình bày trade-off ngắn cho user, **KHÔNG tự chọn**.
129
+
130
+ Ví dụ:
131
+
132
+ User: "Tạo abstract Repository pattern cho User CRUD."
133
+
134
+ AI:
135
+ > Tôi nhận thấy hiện chỉ có 1 implementation (Postgres). Repository pattern thường có giá trị khi có ≥2 backends.
136
+ >
137
+ > **Đề xuất thay thế**: dùng function `userRepo.findById(id)` đơn giản trong file `userRepo.ts`. Khi cần thêm backend mới sẽ refactor (đã có test bao phủ).
138
+ >
139
+ > Vẫn muốn pattern abstract như yêu cầu? Reply YES.
140
+
141
+ #### Khi nào KHÔNG cần đề xuất
142
+
143
+ - Task trivial (rename, sửa typo, format).
144
+ - User đã giải thích rõ lý do business cho cách phức tạp.
145
+ - Đã đề xuất ≥1 lần và user khẳng định.
146
+
147
+ ## Khi nào delegate sang subagent `requirement-analyst`
148
+
149
+ - Yêu cầu rất lớn, cần đọc nhiều file/tài liệu (>5 file lớn).
150
+ - Cần explore codebase rộng để hiểu impact.
151
+ - Bạn cảm thấy sẽ tốn nhiều context cho việc phân tích.
152
+
153
+ Subagent trả về tóm tắt + danh sách câu hỏi, parent agent dùng để hỏi user.
154
+
155
+ ## Output bắt buộc trước khi sang Bước 2
156
+
157
+ - [ ] Đã đọc `docs/INDEX.md` (hook unlock cho phép Read source).
158
+ - [ ] Tóm tắt yêu cầu (2-3 câu).
159
+ - [ ] Liệt kê module ảnh hưởng (slug + trạng thái có sẵn / NEW / backfill).
160
+ - [ ] Giả thuyết / edge cases / rủi ro.
161
+ - [ ] Đã hỏi user đủ câu hỏi để làm rõ yêu cầu, phân tích trường hợp, phản biện và đề xuất phương án tối ưu (HOẶC đã có lý do skip clarify rõ ràng).
162
+ - [ ] Đã cân nhắc cách đơn giản hơn (pass nếu đã tối giản).
163
+ - [ ] User đã trả lời (nếu hỏi) → ghi vào plan section "## Hiểu yêu cầu" ở Bước 3.