@relipa/ai-flow-kit 0.1.2 → 0.1.3

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 (41) hide show
  1. package/README.md +26 -0
  2. package/bin/aiflow.js +40 -1
  3. package/custom/harness/playwright/.env.example +10 -0
  4. package/custom/harness/playwright/playwright.config.ts +34 -0
  5. package/custom/harness/playwright/tests/e2e/auth.setup.ts +25 -0
  6. package/custom/harness/playwright/tests/e2e/fixtures/test.ts +6 -0
  7. package/custom/harness/playwright/tests/e2e/pages/BasePage.ts +9 -0
  8. package/custom/harness/playwright/tests/e2e/support/auth.ts +5 -0
  9. package/custom/mcp-presets/playwright.json +8 -0
  10. package/custom/rules/test-patterns.md +70 -0
  11. package/custom/skills/automation-testing/SKILL.md +239 -0
  12. package/custom/skills/automation-testing/templates/BasePage.ts +29 -0
  13. package/custom/skills/automation-testing/templates/PageObject.example.ts +29 -0
  14. package/custom/skills/automation-testing/templates/playwright.config.ts +39 -0
  15. package/custom/skills/automation-testing/templates/spec.example.ts +29 -0
  16. package/custom/skills/coverage-check/SKILL.md +202 -0
  17. package/custom/skills/evidence-aggregation/SKILL.md +246 -0
  18. package/custom/skills/execute-flow/SKILL.md +479 -0
  19. package/custom/skills/execute-flow/templates/playwright.config.ts +39 -0
  20. package/custom/skills/generate-test-report/SKILL.md +99 -0
  21. package/custom/skills/generate-test-report/templates/test-report.md +58 -0
  22. package/custom/skills/generate-testcase/SKILL.md +303 -0
  23. package/custom/skills/generate-testcase/templates/testcase.md +88 -0
  24. package/custom/skills/log-bug/SKILL.md +131 -0
  25. package/custom/skills/pr-impact-analysis/SKILL.md +180 -0
  26. package/custom/skills/retest-orchestration/SKILL.md +191 -0
  27. package/custom/skills/script-sync/SKILL.md +208 -0
  28. package/custom/skills/test-analysis/SKILL.md +262 -0
  29. package/custom/templates/shared/gate-workflow.md +306 -2
  30. package/docs/common/CHANGELOG.md +52 -0
  31. package/docs/common/QUICK_START.md +30 -0
  32. package/docs/common/cli-reference.md +48 -7
  33. package/package.json +1 -1
  34. package/scripts/create-score-excel.js +20 -7
  35. package/scripts/detect.js +10 -0
  36. package/scripts/guide.js +9 -0
  37. package/scripts/prompt.js +36 -0
  38. package/scripts/scaffold-playwright.js +106 -0
  39. package/scripts/task.js +21 -7
  40. package/scripts/update.js +124 -124
  41. package/scripts/use.js +30 -12
@@ -0,0 +1,180 @@
1
+ ---
2
+ name: pr-impact-analysis
3
+ description: Dev Artifacts Check — Phân tích PR diff để xác định phạm vi ảnh hưởng thật của thay đổi code, đề xuất regression TCs, lưu SHA tracking. Chạy đầu Gate 2a, đầu Gate 3, và sau mỗi RETEST có commit mới.
4
+ keywords: pr, impact analysis, regression, dev artifacts, github, diff, sha, code review, gate2, gate3
5
+ ---
6
+
7
+ # Dev Artifacts Check — PR Impact Analysis
8
+
9
+ > **Mục đích:** Xác định **phạm vi ảnh hưởng thật** của thay đổi code từ PR của dev,
10
+ > để tránh miss regression test khi code thay đổi mở rộng hơn scope ticket.
11
+ >
12
+ > **Khi nào chạy:**
13
+ > - Đầu Gate 2 Phase 2a (sau Gate 1 APPROVED) — xác định regression scope ban đầu
14
+ > - Đầu Gate 3 (trước khi execute) — phát hiện PR mới hoặc commit mới kể từ Gate 2
15
+ > - Sau mỗi RETEST khi dev push commit fix — check xem fix có mở rộng impact không
16
+
17
+ ---
18
+
19
+ ## Trigger
20
+
21
+ Một trong các cách:
22
+
23
+ 1. **TESTER khai báo trong chat:** `PR: <url>` hoặc `PR: <url1>, <url2>` (multi-repo)
24
+ 2. **AI phát hiện tự động:** Ticket có PR link đính kèm → AI đề xuất, TESTER confirm
25
+ 3. **Không có PR** → ghi nhận "chưa có dev artifacts" vào `impact-analysis.md`, không block gate
26
+
27
+ ---
28
+
29
+ ## Quy trình với mỗi PR
30
+
31
+ ### Step 1: Fetch PR Info
32
+
33
+ Ưu tiên `gh` CLI nếu available:
34
+
35
+ ```bash
36
+ gh pr view <url> --json title,body,headRefOid,files
37
+ ```
38
+
39
+ Lấy về:
40
+ - `title` — tiêu đề PR
41
+ - `body` — PR description (thường chứa summary của dev)
42
+ - `headRefOid` — SHA của commit đầu PR (dùng để track delta sau này)
43
+ - `files` — danh sách files thay đổi + số dòng
44
+
45
+ **Fallback (không có `gh` hoặc không phải GitHub):**
46
+ ```bash
47
+ git fetch origin <branch>
48
+ git diff main...<branch> --stat
49
+ ```
50
+ Yêu cầu TESTER cung cấp branch name.
51
+
52
+ ---
53
+
54
+ ### Step 2: Phân tích theo Layer
55
+
56
+ Không đổ cả diff vào context. Phân tích có chọn lọc:
57
+
58
+ **Bước 2a:** Nhóm files theo layer/khu vực:
59
+
60
+ | Layer | Files điển hình | Mức độ rủi ro |
61
+ |-------|----------------|--------------|
62
+ | Migration / Schema | `*.sql`, `*migration*`, `*schema*` | 🔴 High — ảnh hưởng toàn bộ data |
63
+ | Middleware / Config | `middleware/*`, `config/*`, `*.env*` | 🔴 High — ảnh hưởng toàn app |
64
+ | Shared lib / Utils | `lib/*`, `utils/*`, `helpers/*`, `common/*` | 🟡 Medium — nhiều callers |
65
+ | Controller / API route | `controller/*`, `routes/*`, `api/*` | 🟡 Medium — ảnh hưởng endpoint |
66
+ | Service / Business logic | `service/*`, `usecase/*`, `domain/*` | 🟡 Medium |
67
+ | Component / Page | `components/*`, `pages/*`, `views/*` | 🟢 Low — ảnh hưởng UI cụ thể |
68
+ | Test files | `*.test.*`, `*.spec.*`, `__tests__/*` | 🟢 Low — không ảnh hưởng prod |
69
+ | Docs / Config | `*.md`, `*.json` (non-env) | 🟢 Ignore |
70
+
71
+ **Bước 2b:** Với files rủi ro High → đọc full diff:
72
+
73
+ ```bash
74
+ gh pr diff <url> -- <path/to/high-risk-file>
75
+ ```
76
+
77
+ Chỉ đọc files có khả năng tác động lan rộng. Không đọc toàn bộ diff.
78
+
79
+ ---
80
+
81
+ ### Step 3: Map Code → Feature → Regression Scope
82
+
83
+ Dựa trên danh sách files và diff:
84
+
85
+ 1. Xác định **màn hình/chức năng bị ảnh hưởng trực tiếp** (những gì PR cố tình thay đổi)
86
+ 2. Xác định **màn hình/chức năng bị ảnh hưởng gián tiếp** (callers, dependencies, shared code)
87
+ 3. Đề xuất TCs regression cần chạy thêm (ngoài TCs gốc cho feature đang test)
88
+
89
+ **Ví dụ:**
90
+ - PR sửa `UserService.findById()` → ảnh hưởng Profile page, Settings page, Order History (gọi user info)
91
+ - PR thêm migration `ALTER TABLE orders` → ảnh hưởng Order list, Order detail, Cart checkout
92
+
93
+ ---
94
+
95
+ ### Step 4: Record SHA + Output impact-analysis.md
96
+
97
+ Lưu `test-plan/impact-analysis.md`:
98
+
99
+ ```markdown
100
+ # Dev Artifacts — Impact Analysis
101
+
102
+ **Last updated:** [YYYY-MM-DD HH:MM] | **Gate:** [2 / 3 / RETEST]
103
+
104
+ ---
105
+
106
+ ## Dev Artifacts Reference
107
+
108
+ | PR | Repo | SHA đã đọc | Summary | Lần check cuối |
109
+ |----|------|-----------|---------|---------------|
110
+ | #123 | repo-be | a1b2c3d | ✅ Sửa UserService.findById, thêm caching | Gate 2 |
111
+ | #456 | repo-fe | e5f6a7b | ✅ Update ProfilePage component | Gate 2 |
112
+
113
+ _(Nếu chưa có PR: "Chưa có dev artifacts — sẽ check lại ở Gate 3")_
114
+
115
+ ---
116
+
117
+ ## Impact Analysis
118
+
119
+ ### Vùng thay đổi (theo layer)
120
+
121
+ | Layer | Files | Số dòng thay đổi | Rủi ro |
122
+ |-------|-------|-----------------|--------|
123
+ | Service | `UserService.java` | +45/-12 | 🟡 Medium |
124
+ | Component | `ProfilePage.tsx` | +23/-8 | 🟢 Low |
125
+
126
+ ### Màn hình ảnh hưởng trực tiếp
127
+ - **Profile Page** (`/profile`) — component thay đổi trực tiếp
128
+ - **Settings Page** (`/settings`) — gọi UserService.findById
129
+
130
+ ### Màn hình ảnh hưởng gián tiếp (regression risk)
131
+ - **Order History** (`/orders`) — sử dụng UserService.findById cho user info
132
+ _Lý do: caching layer mới có thể trả về stale data cho order display_
133
+ - **Admin User Management** (`/admin/users`) — cùng service
134
+
135
+ ### Đề xuất Regression TCs
136
+
137
+ Ngoài TCs gốc của feature, cần test thêm:
138
+
139
+ | TC (Regression) | Lý do |
140
+ |-----------------|-------|
141
+ | Verify Order History hiển thị đúng user info | UserService.findById đã thêm caching |
142
+ | Verify Admin User list không bị cache stale | Shared service thay đổi |
143
+ ```
144
+
145
+ ---
146
+
147
+ ## Guard Rails (bắt buộc)
148
+
149
+ > ⚠️ PR diff + summary chỉ được dùng để **mở rộng độ phủ** (thêm TC, thêm vùng regression).
150
+ > **Tuyệt đối KHÔNG dùng để xác định expected result** — expected result chỉ lấy từ ticket/spec của BA/PM.
151
+ >
152
+ > Lý do: nếu dev hiểu sai requirement → TC sinh từ dev artifacts cũng sai → test pass nhưng feature làm sai.
153
+ > Khi dev artifacts mâu thuẫn với spec → flag thành câu hỏi hoặc bug tiềm năng, không sửa TC.
154
+
155
+ ---
156
+
157
+ ## Delta Detection (Gate 3 + RETEST)
158
+
159
+ Khi re-run Dev Artifacts Check ở Gate 3 hoặc sau RETEST:
160
+
161
+ 1. Đọc SHA đã ghi trong `impact-analysis.md`
162
+ 2. Fetch SHA hiện tại của PR: `gh pr view <url> --json headRefOid`
163
+ 3. **Nếu SHA thay đổi** → có commit mới → đọc diff delta:
164
+ ```bash
165
+ gh pr diff <url> -- <files-changed-since-old-sha>
166
+ ```
167
+ 4. **Phân tích delta** → đề xuất TC bổ sung (mini-loop, chỉ phần thêm mới)
168
+ 5. Cập nhật SHA mới vào `impact-analysis.md`
169
+
170
+ **Không cần TESTER approve lại toàn bộ Gate 2** — chỉ approve **phần delta** (TCs mới do commit mới gây ra).
171
+
172
+ ---
173
+
174
+ ## Mandatory Rules
175
+
176
+ - ❌ **KHÔNG** dùng expected result từ PR description — chỉ dùng ticket/spec của BA
177
+ - ❌ **KHÔNG** đọc full diff của toàn bộ files — chỉ đọc selective (high-risk files)
178
+ - ✅ **PHẢI** ghi SHA đã đọc vào `impact-analysis.md` để delta detection sau này
179
+ - ✅ **PHẢI** phân biệt rõ ảnh hưởng trực tiếp vs gián tiếp
180
+ - ✅ Không có PR → không block gate, ghi nhận và tiến tiếp
@@ -0,0 +1,191 @@
1
+ ---
2
+ name: retest-orchestration
3
+ description: Gate 3 RETEST loop — Parse lệnh "RETEST: TC_ID" từ TESTER, re-run Dev Artifacts Check (phát hiện commit mới), chạy Playwright selective cho TCs được chỉ định, cập nhật evidence và bug status.
4
+ keywords: gate3, retest, loop, re-execute, playwright, dev artifacts, delta, bug fix, selective test
5
+ ---
6
+
7
+ # RETEST Orchestration — Gate 3 Loop
8
+
9
+ > **Mục đích:** Xử lý lệnh `RETEST` từ TESTER sau khi dev fix bug, re-run Playwright có chọn lọc,
10
+ > và cập nhật evidence + bug status tương ứng.
11
+ >
12
+ > **Trigger:** TESTER gõ `RETEST: AD10_002` hoặc `RETEST: AD10_001, AD10_002, AD10_003`
13
+
14
+ ---
15
+
16
+ ## Trigger Syntax
17
+
18
+ ```
19
+ RETEST: AD10_002 # Re-run 1 TC
20
+ RETEST: AD10_002, AD10_005 # Re-run nhiều TCs
21
+ RETEST: AD10_002, AD10_005, AD10_008
22
+ ```
23
+
24
+ AI parse TC IDs từ text sau `RETEST:` (case-insensitive, trim whitespace, split by comma).
25
+
26
+ ---
27
+
28
+ ## Step 1: Re-run Dev Artifacts Check
29
+
30
+ Trước khi re-execute, **luôn luôn** chạy Dev Artifacts Check (invoke `pr-impact-analysis` skill):
31
+
32
+ **Lý do:** Dev commit fix có thể thay đổi thêm code ngoài chỗ đang fix → cần phát hiện và cover.
33
+
34
+ 1. Đọc SHA đã ghi trong `test-plan/impact-analysis.md`
35
+ 2. Fetch SHA hiện tại: `gh pr view <url> --json headRefOid`
36
+ 3. **Nếu SHA không thay đổi** → skip delta analysis, tiến sang Step 2
37
+ 4. **Nếu SHA thay đổi** → có commit mới:
38
+ - Phân tích diff delta (chỉ phần thay đổi từ SHA cũ → SHA mới)
39
+ - Đề xuất TC bổ sung nếu có area mới bị ảnh hưởng
40
+ - Hiển thị **mini-loop prompt:**
41
+
42
+ ```
43
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
44
+ ⚠️ RETEST — DELTA DETECTED
45
+
46
+ Dev đã push commit mới (SHA: [old] → [new])
47
+ Diff mới ảnh hưởng thêm:
48
+ - [file/area 1] → [feature bị ảnh hưởng]
49
+ - [file/area 2] → [feature bị ảnh hưởng]
50
+
51
+ Đề xuất TC bổ sung:
52
+ - TC_[Module]_XXX: [Scenario mới cần test do delta]
53
+
54
+ → Type APPROVED to add these TCs and continue RETEST
55
+ → Type SKIP to proceed without new TCs
56
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
57
+ ```
58
+
59
+ - TESTER gõ `APPROVED` → generate scripts cho TC mới → thêm vào RETEST list
60
+ - TESTER gõ `SKIP` → tiến sang Step 2 chỉ với TCs ban đầu
61
+ - Cập nhật SHA mới vào `impact-analysis.md`
62
+
63
+ ---
64
+
65
+ ## Step 2: Execute Playwright (Selective)
66
+
67
+ Chạy Playwright chỉ cho các TCs được chỉ định:
68
+
69
+ ```bash
70
+ BASE_URL=<baseUrl> npx playwright test --grep "AD10_002|AD10_005" --headed
71
+ ```
72
+
73
+ **Nếu một TC không có script** (type = Manual hoặc script chưa được sinh):
74
+ - Hiển thị: `⚠️ AD10_011: Không có Playwright script (Manual TC). Tester cần test thủ công.`
75
+ - Bỏ qua TC đó, tiếp tục với các TCs còn lại
76
+
77
+ **Nếu script bị lỗi syntax** (script cũ, selector đã hỏng):
78
+ - Hiển thị error cụ thể
79
+ - Đề xuất re-generate script: `Muốn tôi cập nhật script cho TC này không?`
80
+
81
+ ---
82
+
83
+ ## Step 3: Cập nhật Evidence
84
+
85
+ Invoke `evidence-aggregation` skill cho RETEST results:
86
+
87
+ **Không xóa evidence cũ** — tạo subfolder theo run:
88
+
89
+ ```
90
+ evidence/
91
+ ├── AD10_002-error-sai-password/
92
+ │ ├── run-1/ ← Original run (FAIL)
93
+ │ │ ├── failure-screenshot.png
94
+ │ │ └── result.md
95
+ │ └── run-2/ ← RETEST run (kết quả mới)
96
+ │ ├── step-01.png
97
+ │ └── result.md
98
+ ```
99
+
100
+ **result.md của run mới** phải link về run cũ:
101
+
102
+ ```markdown
103
+ # Result: AD10_002 — RETEST Run 2
104
+
105
+ **Status:** ✅ PASS (Previous: ❌ FAIL — Run 1)
106
+ **Run date:** [YYYY-MM-DD HH:MM]
107
+ **Bug reference:** bugs/BUG-001-error-message-khong-hien.md → RESOLVED
108
+
109
+ ...
110
+ ```
111
+
112
+ ---
113
+
114
+ ## Step 4: Cập nhật Bug Status
115
+
116
+ Với mỗi TC trong RETEST:
117
+
118
+ **TC pass sau RETEST** (trước đó fail):
119
+ - Đọc `bugs/` để tìm BUG liên quan đến TC_ID đó
120
+ - Cập nhật BUG file: thêm section Resolution:
121
+
122
+ ```markdown
123
+ ## Resolution
124
+
125
+ **Status:** ✅ RESOLVED
126
+ **Fixed in commit:** [SHA từ impact-analysis.md]
127
+ **Retest result:** ✅ PASS — [YYYY-MM-DD]
128
+ **Retest evidence:** evidence/AD10_002-error-sai-password/run-2/
129
+ ```
130
+
131
+ **TC vẫn fail sau RETEST**:
132
+ - Cập nhật BUG file: thêm RETEST attempt:
133
+
134
+ ```markdown
135
+ ## Retest History
136
+
137
+ | Run | Date | Result | Notes |
138
+ |-----|------|--------|-------|
139
+ | 1 | [Date] | ❌ FAIL | Initial run |
140
+ | 2 | [Date] | ❌ FAIL | Dev fix không resolve issue |
141
+
142
+ **Action needed:** Dev cần investigate thêm. Error vẫn reproduce với [details].
143
+ ```
144
+
145
+ ---
146
+
147
+ ## Step 5: Display RETEST Summary
148
+
149
+ ```
150
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
151
+ 🔁 RETEST COMPLETE
152
+
153
+ TCs re-executed: [N]
154
+ ✅ Now PASS: [N] (bugs RESOLVED)
155
+ ❌ Still FAIL: [N] (bugs remain OPEN)
156
+ ⏭ Skipped (Manual): [N]
157
+
158
+ Bugs updated:
159
+ ✅ RESOLVED: BUG-001, BUG-003
160
+ 🔴 Still OPEN: BUG-002, BUG-004
161
+
162
+ [Nếu còn critical/high bugs open:]
163
+ → Review bugs: bugs/
164
+ → Dev cần fix thêm: [list bugs còn open]
165
+ → Type RETEST: [TC_ID] when dev fixes again
166
+
167
+ [Nếu tất cả critical/high bugs đã resolved:]
168
+ → All critical/high issues resolved! ✅
169
+ → Type APPROVED to proceed to Gate 4 (Test Report)
170
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
171
+ ```
172
+
173
+ ---
174
+
175
+ ## Loop Continuation
176
+
177
+ Gate 3 loop tiếp tục cho đến khi:
178
+ - **Điều kiện kết thúc loop:** Tất cả Critical và High bugs đã RESOLVED và pass RETEST
179
+ - **Medium/Low bugs:** TESTER có thể chọn defer (không bắt buộc phải pass trước Gate 4)
180
+ - **TESTER gõ `APPROVED`** → Gate 4 bắt đầu (invoke `generate-test-report` skill)
181
+
182
+ ---
183
+
184
+ ## Mandatory Rules
185
+
186
+ - ✅ **PHẢI** re-run Dev Artifacts Check trước mỗi RETEST (kể cả delta = 0)
187
+ - ✅ **PHẢI** cập nhật bug status sau mỗi RETEST
188
+ - ✅ Evidence của các run phải được giữ lại (không xóa)
189
+ - ❌ **KHÔNG** tự động chuyển sang Gate 4 — chỉ khi TESTER gõ APPROVED
190
+ - ❌ **KHÔNG** skip delta analysis kể cả khi TESTER nói "chỉ 1 dòng fix"
191
+ - ✅ Manual TCs → nhắc TESTER test thủ công, không bỏ qua
@@ -0,0 +1,208 @@
1
+ ---
2
+ name: script-sync
3
+ description: Sync test cases với Playwright scripts theo cơ chế hash. Với mỗi TC_ID trong TC file, kiểm tra script hiện tại bằng @tc-hash comment — gen mới nếu chưa có, update nếu TC thay đổi, skip nếu không đổi. Dùng Playwright MCP để lấy selector thật khi gen/update.
4
+ allowed-tools: Read, Write, Edit, Glob, Grep, Bash, mcp__playwright__browser_navigate, mcp__playwright__browser_snapshot, mcp__playwright__browser_generate_locator, mcp__playwright__browser_click, mcp__playwright__browser_type, mcp__playwright__browser_close
5
+ ---
6
+
7
+ # Skill: script-sync
8
+
9
+ Sync test cases (từ TC file `.md`) với Playwright spec files, sử dụng **hash-based change detection**
10
+ để chỉ gen/update những TC thực sự thay đổi — tránh overwrite script đang chạy tốt.
11
+
12
+ ---
13
+
14
+ ## Input
15
+
16
+ Được gọi từ `execute-flow` skill (Gate 2) với context:
17
+
18
+ - `tcFile`: path đến TC file markdown (vd `testcases/AD10.md`)
19
+ - `repo`: tên repo (vd `repo-fe`)
20
+ - `screenId`: mã màn hình, always lowercase (vd `ad10`, not `AD10`) — directory paths use lowercase; spec file name `{ScreenID}.spec.ts` remains uppercase
21
+ - `baseUrl`: URL của app để Playwright MCP snapshot
22
+
23
+ ---
24
+
25
+ ## Hash Computation
26
+
27
+ **Công thức:** `SHA1(TC_ID + "|" + Steps + "|" + Expected Result)` → lấy 8 ký tự đầu.
28
+
29
+ Các trường lấy từ TC file:
30
+ - `TC_ID`: cột "Test Case ID"
31
+ - `Steps`: cột "Steps" (giữ nguyên text, bao gồm số thứ tự)
32
+ - `Expected Result`: cột "Expected Result"
33
+
34
+ Không tính vào hash: `Severity`, `Pre-condition`, `Data Test`, `Ticket ID`, `Comment`, `R1/R2 columns`.
35
+
36
+ **Mục đích:** Hash chỉ thay đổi khi steps hoặc expected result thay đổi — sửa comment/severity không trigger update.
37
+
38
+ ---
39
+
40
+ ## Spec File Structure
41
+
42
+ Mỗi TC trong spec file có metadata comment ngay trước `test()`:
43
+
44
+ ```typescript
45
+ // @screen-id: AD10
46
+ // @screen-name: Create Product
47
+ // @repo: repo-fe
48
+ // @screen-url: /admin/products/create
49
+ // @generated: YYYY-MM-DD
50
+
51
+ import { test, expect } from '../../shared/fixtures/test'
52
+ import { AD10Page } from '../pages/AD10Page'
53
+
54
+ test.describe('AD10 - Create Product', () => {
55
+
56
+ // @tc-hash: a3f9b2c1
57
+ // @tc-id: AD10_001
58
+ test('AD10_001 - Truy cập trực tiếp qua URL khi chưa đăng nhập', async ({ page }) => {
59
+ // ...
60
+ })
61
+
62
+ // @tc-hash: d7e2f4a9
63
+ // @tc-id: AD10_002
64
+ test('AD10_002 - Truy cập trực tiếp qua URL khi đã đăng nhập', async ({ page }) => {
65
+ // ...
66
+ })
67
+
68
+ })
69
+ ```
70
+
71
+ ---
72
+
73
+ ## Sync Algorithm
74
+
75
+ ### Bước 1: Parse TC file
76
+
77
+ Đọc TC file, extract từ Section 3 (Danh sách Test Cases Chi Tiết):
78
+ - TC_ID, Test Case Name, Steps, Expected Result, Severity
79
+
80
+ Nhận diện **Manual TCs** — các TC không thể automation:
81
+ - Steps đề cập "kiểm tra DB", "kiểm tra email", "kiểm tra file system"
82
+ - Steps quá mơ hồ: "Quan sát giao diện", "Kiểm tra layout, màu sắc"
83
+ - Steps yêu cầu hành động ngoài browser: restart server, check log file
84
+
85
+ ### Bước 2: Scan spec file hiện tại
86
+
87
+ Tìm `ak-test/{repo}/scripts/{screenId}/{ScreenID}.spec.ts`.
88
+
89
+ Nếu tồn tại: đọc file, extract tất cả cặp `@tc-hash` + `@tc-id` bằng regex:
90
+ ```
91
+ // @tc-hash: ([a-f0-9]{8})
92
+ // @tc-id: ([A-Za-z0-9_]+)
93
+ ```
94
+
95
+ Tạo map: `{ [TC_ID]: hash }` từ spec file hiện tại.
96
+
97
+ ### Bước 3: Classify từng TC
98
+
99
+ Với mỗi TC trong TC file:
100
+
101
+ | Điều kiện | Status | Hành động |
102
+ |-----------|--------|-----------|
103
+ | TC là Manual TC | `manual` | Bỏ qua, đánh dấu Untest |
104
+ | Không có trong spec file | `new` | Gen script mới |
105
+ | Có trong spec file, hash khớp | `skipped` | Không làm gì |
106
+ | Có trong spec file, hash khác | `updated` | Update test block |
107
+
108
+ ### Bước 4: Gen script cho TCs có status `new`
109
+
110
+ Với mỗi TC cần gen mới:
111
+
112
+ 1. Tính hash mới: `SHA1(TC_ID + "|" + Steps + "|" + Expected Result)[:8]`
113
+ 2. Dùng Playwright MCP để lấy selectors thật:
114
+ - `mcp__playwright__browser_navigate` → `baseUrl + screenUrl`
115
+ - `mcp__playwright__browser_snapshot` → lấy accessibility tree
116
+ - Với từng element trong Steps: `mcp__playwright__browser_generate_locator`
117
+ 3. Sinh test block với metadata comments:
118
+
119
+ ```typescript
120
+ // @tc-hash: {hash}
121
+ // @tc-id: {TC_ID}
122
+ test('{TC_ID} - {Test Case Name}', async ({ page }) => {
123
+ const pageObj = new {ScreenID}Page(page)
124
+ // Step 1: {step text}
125
+ await pageObj.{action}()
126
+ // Step 2: {step text}
127
+ await pageObj.{action}()
128
+ // Expected: {expected result}
129
+ await expect(page.{locator}).{assertion}
130
+ })
131
+ ```
132
+
133
+ 4. Nếu spec file chưa tồn tại: tạo file mới với file header + describe wrapper + test block.
134
+ 5. Nếu spec file đã tồn tại: append test block vào trước closing `})` của `test.describe`.
135
+ 6. Nếu `{ScreenID}Page.ts` chưa tồn tại: tạo Page Object với locators cho các elements đã snapshot.
136
+
137
+ **File header khi tạo spec mới:**
138
+ ```typescript
139
+ // @screen-id: {ScreenID}
140
+ // @screen-name: {Screen Name}
141
+ // @repo: {repo}
142
+ // @screen-url: {url path}
143
+ // @generated: {YYYY-MM-DD}
144
+
145
+ import { test, expect } from '../../shared/fixtures/test'
146
+ import { {ScreenID}Page } from '../pages/{ScreenID}Page'
147
+
148
+ test.describe('{ScreenID} - {Screen Name}', () => {
149
+ ```
150
+
151
+ ### Bước 5: Update test block cho TCs có status `updated`
152
+
153
+ 1. Tính hash mới
154
+ 2. Snapshot DOM với Playwright MCP (các element có thể thay đổi selector nếu TC đổi)
155
+ 3. Tìm block cũ trong spec file bằng pattern:
156
+ ```
157
+ // @tc-hash: {old-hash}\n // @tc-id: {TC_ID}\n test(...)
158
+ ```
159
+ 4. Replace toàn bộ block cũ (từ `// @tc-hash` đến closing `})` của test) bằng block mới
160
+
161
+ ### Bước 6: Xử lý TCs không gen được
162
+
163
+ | Lý do | Marker |
164
+ |-------|--------|
165
+ | TC manual (DB/email/file check) | `[MANUAL]` — Untest |
166
+ | Steps mơ hồ, không map được selector | `[NEEDS_CLARIFY]` — hỏi tester |
167
+ | Playwright MCP không snapshot được (iframe, native dialog) | `[BLOCKED: {lý do}]` |
168
+ | Race condition (double-click, network timing) | `[BLOCKED: timing-dependent]` |
169
+
170
+ Với `[NEEDS_CLARIFY]`: hỏi tester rõ element nào cần tương tác, sau đó gen.
171
+
172
+ ### Bước 7: Đóng browser
173
+
174
+ ```
175
+ mcp__playwright__browser_close
176
+ ```
177
+
178
+ ---
179
+
180
+ ## Output Summary
181
+
182
+ ```
183
+ 📊 SCRIPT SYNC SUMMARY — {ScreenID}
184
+
185
+ ✅ Gen mới: {N} TCs → {ScreenID}.spec.ts
186
+ 🔄 Updated: {N} TCs → hash refreshed
187
+ ⏭️ Skipped: {N} TCs → không đổi
188
+ ⚠️ Manual: {N} TCs → {TC_IDs} (lý do)
189
+ ❌ Blocked: {N} TCs → {TC_IDs} (lý do)
190
+
191
+ → Script: ak-test/{repo}/scripts/{screenId}/{ScreenID}.spec.ts
192
+ → Page Object: ak-test/{repo}/scripts/pages/{ScreenID}Page.ts
193
+ ```
194
+
195
+ Trả về danh sách kết quả cho `execute-flow`:
196
+ - Danh sách TC_IDs có thể chạy automation (gen mới + updated + skipped)
197
+ - Danh sách TC_IDs manual (Untest)
198
+ - Danh sách TC_IDs blocked (Pending)
199
+
200
+ ---
201
+
202
+ ## Mandatory Rules
203
+
204
+ - ❌ **Không bao giờ bịa selector** — phải dùng Playwright MCP snapshot
205
+ - ❌ **Không overwrite** test block có hash match — skip hoàn toàn
206
+ - ✅ Ưu tiên locator: `getByRole` > `getByLabel` > `getByPlaceholder` > `getByText` > `getByTestId` > CSS
207
+ - ✅ Không tạo lại `BasePage.ts` / `fixtures/test.ts` nếu đã tồn tại
208
+ - ✅ Viết test names và comments bằng tiếng Việt