@relipa/ai-flow-kit 0.1.2 → 0.1.4-beta.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 (94) hide show
  1. package/README.md +139 -0
  2. package/bin/aiflow.js +89 -2
  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/ba-skills/skill-ba-phan-tich-ban-dau-v1.md +44 -0
  17. package/custom/skills/ba-skills/skill-ba-prototype-v1.md +35 -0
  18. package/custom/skills/ba-skills/skill-ba-qa-template-v1.md +21 -0
  19. package/custom/skills/ba-skills/skill-ba-qa-v1.md +35 -0
  20. package/custom/skills/ba-skills/skill-ba-template-phan-tich-ban-dau-v1.md +30 -0
  21. package/custom/skills/ba-skills/skill-ba-template-uc-v1.md +83 -0
  22. package/custom/skills/ba-skills/skill-ba-ve-luong-mermaid-v1.md +35 -0
  23. package/custom/skills/ba-skills/skill-ba-viet-spec-uc-v1.md +38 -0
  24. package/custom/skills/ba-skills/skill-ba-xay-dung-business-rules-v1.md +39 -0
  25. package/custom/skills/coverage-check/SKILL.md +202 -0
  26. package/custom/skills/evidence-aggregation/SKILL.md +246 -0
  27. package/custom/skills/execute-flow/SKILL.md +499 -0
  28. package/custom/skills/execute-flow/templates/playwright.config.ts +39 -0
  29. package/custom/skills/gate-review/SKILL.md +195 -0
  30. package/custom/skills/generate-test-report/SKILL.md +99 -0
  31. package/custom/skills/generate-test-report/templates/test-report.md +58 -0
  32. package/custom/skills/generate-testcase/SKILL.md +350 -0
  33. package/custom/skills/generate-testcase/templates/testcase.md +88 -0
  34. package/custom/skills/log-bug/SKILL.md +131 -0
  35. package/custom/skills/pr-impact-analysis/SKILL.md +180 -0
  36. package/custom/skills/retest-orchestration/SKILL.md +191 -0
  37. package/custom/skills/script-sync/SKILL.md +208 -0
  38. package/custom/skills/test-analysis/SKILL.md +300 -0
  39. package/custom/skills/test-skills/categories/00-core/00.01.requirement-analysis.md +111 -0
  40. package/custom/skills/test-skills/categories/00-core/00.02.risk-analysis.md +24 -0
  41. package/custom/skills/test-skills/categories/00-core/00.03.test-scenario-builder.md +90 -0
  42. package/custom/skills/test-skills/categories/00-core/00.04.testcase-review.md +68 -0
  43. package/custom/skills/test-skills/categories/01-test-design/01.01.boundary-value-analysis.md +30 -0
  44. package/custom/skills/test-skills/categories/01-test-design/01.02.equivalence.partitioning.md +27 -0
  45. package/custom/skills/test-skills/categories/01-test-design/01.03.decision-table.md +26 -0
  46. package/custom/skills/test-skills/categories/01-test-design/01.04.state.transition.md +26 -0
  47. package/custom/skills/test-skills/categories/01-test-design/01.05.pairwise.md +25 -0
  48. package/custom/skills/test-skills/categories/01-test-design/01.06.error-guessing.md +28 -0
  49. package/custom/skills/test-skills/categories/02-ui-testing/02.01.UI-layout.md +29 -0
  50. package/custom/skills/test-skills/categories/02-ui-testing/02.02.form-validation.md +57 -0
  51. package/custom/skills/test-skills/categories/02-ui-testing/02.03.navigation.md +27 -0
  52. package/custom/skills/test-skills/categories/02-ui-testing/02.04.localization.md +27 -0
  53. package/custom/skills/test-skills/categories/02-ui-testing/02.05.accessibility.md +27 -0
  54. package/custom/skills/test-skills/categories/03-business-testing/03.01.CRUD-testing.md +51 -0
  55. package/custom/skills/test-skills/categories/03-business-testing/03.02.workflow-testing.md +44 -0
  56. package/custom/skills/test-skills/categories/03-business-testing/03.03.permission-testing.md +41 -0
  57. package/custom/skills/test-skills/categories/03-business-testing/03.04.dependency-validation.md +40 -0
  58. package/custom/skills/test-skills/categories/03-business-testing/03.05.notification-testing.md +43 -0
  59. package/custom/skills/test-skills/categories/03-business-testing/03.06.calculation.testing.md +44 -0
  60. package/custom/skills/test-skills/categories/04-data-testing/04.01.database-testing.md +43 -0
  61. package/custom/skills/test-skills/categories/04-data-testing/04.02.import-export-testing.md +43 -0
  62. package/custom/skills/test-skills/categories/04-data-testing/04.03.data-mapping.md +39 -0
  63. package/custom/skills/test-skills/categories/04-data-testing/04.04.duplicate-handling.md +39 -0
  64. package/custom/skills/test-skills/categories/04-data-testing/04.05.migration.md +42 -0
  65. package/custom/skills/test-skills/categories/05-integration/05.01.API-testing.md +37 -0
  66. package/custom/skills/test-skills/categories/05-integration/05.02.third-party-integration.md +36 -0
  67. package/custom/skills/test-skills/categories/05-integration/05.03.batch-processing.md +38 -0
  68. package/custom/skills/test-skills/categories/05-integration/05.04.file-upload-download.md +40 -0
  69. package/custom/skills/test-skills/categories/08-domain-skills/CMS.md +34 -0
  70. package/custom/skills/test-skills/categories/08-domain-skills/Ecommerce.md +35 -0
  71. package/custom/skills/test-skills/categories/99-review/99.01.coverage-review.md +35 -0
  72. package/custom/skills/test-skills/categories/99-review/99.02.knowledge-learning.md +34 -0
  73. package/custom/skills/test-skills/categories/99-review/99.03.repository-update.md +33 -0
  74. package/custom/skills/test-skills/categories/99-review/99.04.change-history.md +38 -0
  75. package/custom/skills/test-skills/rules/Directory_and_Naming_Convention.md +257 -0
  76. package/custom/skills/test-skills/rules/QA_Writing_Standards.md +49 -0
  77. package/custom/skills/test-skills/template/template_testcase.md +92 -0
  78. package/custom/templates/shared/create-spec-workflow.md +441 -0
  79. package/custom/templates/shared/create-testcase-workflow.md +470 -0
  80. package/custom/templates/shared/gate-workflow.md +421 -11
  81. package/docs/common/CHANGELOG.md +52 -0
  82. package/docs/common/QUICK_START.md +30 -0
  83. package/docs/common/cli-reference.md +48 -7
  84. package/package.json +2 -2
  85. package/scripts/create-score-excel.js +37 -14
  86. package/scripts/detect.js +10 -0
  87. package/scripts/guide.js +9 -0
  88. package/scripts/init.js +48 -1
  89. package/scripts/prompt.js +36 -0
  90. package/scripts/review.js +91 -0
  91. package/scripts/scaffold-playwright.js +106 -0
  92. package/scripts/task.js +21 -7
  93. package/scripts/update.js +127 -124
  94. package/scripts/use.js +36 -12
@@ -0,0 +1,499 @@
1
+ ---
2
+ name: execute-flow
3
+ description: Executing Flow — 4 gates độc lập để thực thi Playwright từ testcase có sẵn. Gate 1 load TC file và sinh work plan. Gate 2 sync scripts (hash-based). Gate 3 chạy playwright và thu thập evidence. Gate 4 sinh report và hỏi log bug lên Jira. Không cần đi qua workflow.md Gate 1-2.
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_close
5
+ ---
6
+
7
+ # Executing Flow
8
+
9
+ Flow độc lập để tester thực thi test từ TC file có sẵn, không cần chạy lại phân tích (workflow.md Gate 1-2).
10
+
11
+ ## Entry Points
12
+
13
+ | Nguồn | Trigger | Cách AI xử lý |
14
+ |-------|---------|---------------|
15
+ | Ticket | `ak execute PROJ-33` | Tìm TC file trong `.aiflow/context/current.json` |
16
+ | File | `ak execute ./testcases/AD10.md` | Đọc trực tiếp file path |
17
+ | Manual | `ak execute` (không argument) | Hỏi tester: "TC file của bạn ở đâu?" |
18
+
19
+ ---
20
+
21
+ ## ⛩️ GATE 1 — Context & Work Plan
22
+
23
+ ### Pre-flight checks (auto, không hỏi tester)
24
+
25
+ Kiểm tra trước khi làm gì:
26
+
27
+ 0. **MCP Playwright** có được cấu hình không?
28
+ - Kiểm tra **`~/.claude/settings.json`** (global user-level, áp dụng cho mọi project): có key `playwright` trong `mcpServers` không?
29
+ - Nếu thiếu → dừng, hỏi tester:
30
+ > "⚠️ MCP Playwright chưa được cấu hình. Đây là yêu cầu bắt buộc để chạy browser automation.
31
+ > Sẽ cài vào **global settings** (`~/.claude/settings.json`) — chỉ cần làm một lần, dùng được cho mọi repo.
32
+ > → Tự động cài đặt? [Y/n]"
33
+ - Nếu tester chọn **Y** (hoặc Enter):
34
+ - Đọc `~/.claude/settings.json`
35
+ - Thêm key `playwright` vào `mcpServers` (giữ nguyên các key khác):
36
+ ```json
37
+ "playwright": {
38
+ "command": "npx",
39
+ "args": ["-y", "@playwright/mcp@latest", "--isolated", "--browser", "chromium", "--headless"]
40
+ }
41
+ ```
42
+ - Ghi lại file `~/.claude/settings.json`
43
+ - Thông báo:
44
+ > "✅ Đã cài MCP Playwright vào global settings. **Vui lòng restart Claude Code** để load MCP server, sau đó chạy lại lệnh `ak execute`."
45
+ - Dừng. Không proceed cho đến khi tester restart và chạy lại.
46
+ - Nếu tester chọn **n** → dừng, hướng dẫn:
47
+ > "Để cài thủ công: mở `~/.claude/settings.json`, thêm `playwright` vào `mcpServers`, rồi restart Claude Code."
48
+
49
+ 1. TC file có parse được không? (file tồn tại, có Section 3 — Danh sách Test Cases)
50
+ 2. `ak-test/` folder có tồn tại không? Nếu không → hướng dẫn tester tạo: `mkdir ak-test`
51
+ 3. `BASE_URL` env var có set không? Nếu không → hỏi: "BASE_URL chưa set. App đang chạy ở URL nào?"
52
+
53
+ Items 1–3 chạy ngay khi entry. Item 4 chạy sau khi repo được xác định từ Bước 1 (parse TC file):
54
+
55
+ 4. `playwright.config.ts` có tồn tại trong `ak-test/{repo}/` không? Nếu không → dừng, hướng dẫn tester: "Chưa có playwright.config.ts cho repo {repo}. Tạo file từ template tại `ak-test/{repo}/playwright.config.ts` (xem skill execute-flow templates)."
56
+
57
+ Nếu bất kỳ check nào fail → dừng, hướng dẫn fix. Không proceed.
58
+
59
+ ### Bước 1: Parse TC file
60
+
61
+ Đọc TC file, extract từ Section 1 — Thông tin chung:
62
+ - `Screen_ID`: từ "Mã màn hình - Tên màn hình" (vd `AD10_Create Product` → ScreenID = `AD10`)
63
+ - `Screen_Name`: phần sau `_` (vd `Create Product`)
64
+ - `Repo`: từ dòng "Repo" (vd `repo-fe`)
65
+
66
+ Nếu thiếu `Repo` field → hỏi tester:
67
+ > "TC file của màn hình `{ScreenID}` chưa có thông tin Repo. Repo này nằm trong repository nào?
68
+ > (vd: repo-fe, repo-be)"
69
+
70
+ Chờ tester trả lời rồi mới tiếp tục.
71
+
72
+ Nếu nhiều màn hình khác repo → hỏi từng màn hình một.
73
+
74
+ ### Bước 1b: Đọc Source Code (nếu workspace có source repos)
75
+
76
+ Chạy ngay sau khi xác định được `Repo`, trước khi extract TCs.
77
+
78
+ Nếu workspace mở dạng parent folder chứa cả `ak docs` lẫn source code repos:
79
+
80
+ 1. **Nếu GitNexus MCP có sẵn** (`.mcp.json` có entry `gitnexus`):
81
+ - `gitnexus: query("tên màn hình {ScreenID}")` → tìm component, page, form liên quan
82
+ - `gitnexus: context("ComponentName")` → xem toàn bộ component/template
83
+ 2. **Nếu không có GitNexus**: đọc trực tiếp trong `{repo}/`:
84
+ - Component / Page / View của màn hình — tìm `data-testid`, `id`, `name` của các element
85
+ - Form / Input structure — hiểu hierarchy của DOM
86
+ - Route / path mapping — xác nhận URL path của màn hình
87
+ 3. Lưu lại thông tin để Gate 2 (Script Sync) sử dụng:
88
+ - Danh sách `data-testid` / `id` của các element tương tác
89
+ - Cấu trúc form (fieldset, section, tab nếu có)
90
+ - URL path chính xác của màn hình
91
+
92
+ > Mục đích: Giúp `script-sync` (Gate 2) viết Playwright scripts với selectors chính xác hơn, giảm phụ thuộc vào browser snapshot khi app chưa chạy.
93
+
94
+ ### Bước 2: Extract TCs từ Section 3
95
+
96
+ Đọc tất cả rows trong các bảng Section 3.x, extract:
97
+ - TC_ID, Test Case Name, Severity
98
+
99
+ Phân loại sơ bộ:
100
+ - **Manual TC**: Steps đề cập "kiểm tra DB", "kiểm tra file", "Quan sát giao diện tổng quan", "Kiểm tra layout/màu sắc"
101
+ - **Automation TC**: còn lại
102
+
103
+ ### Bước 3: Scan scripts hiện tại
104
+
105
+ Tìm `ak-test/{repo}/scripts/{screenId}/{ScreenID}.spec.ts`:
106
+ - Nếu tồn tại: đọc `@tc-id` comments → xác định TCs đã có script
107
+ - Tính hash cho từng TC → so với `@tc-hash` trong file → xác định `updated` vs `skipped`
108
+ - Nếu không tồn tại: tất cả automation TCs đều là `new`
109
+
110
+ ### Bước 4: Hiển thị Work Plan
111
+
112
+ ```
113
+ 📋 WORK PLAN — {ticket hoặc tên TC file}
114
+
115
+ Requirement Overview:
116
+ - Màn hình: {ScreenID}_{Screen Name} ({repo})
117
+ - Tổng TC: {N} | Automation: {N} | Manual/Untest: {N}
118
+
119
+ Script Sync Plan:
120
+ | Screen | TC_ID | Script hiện tại | Trạng thái |
121
+ |--------|----------|---------------------------|---------------|
122
+ | AD10 | AD10_001 | - | 🆕 Gen mới |
123
+ | AD10 | AD10_002 | AD10.spec.ts (hash match) | ⏭️ Skip |
124
+ | AD10 | AD10_005 | AD10.spec.ts (hash diff) | 🔄 Update |
125
+ | AD10 | AD10_023 | - | ⚠️ Manual TC |
126
+
127
+ → Cần gen mới: {N} | Update: {N} | Skip: {N} | Manual (Untest): {N}
128
+ ```
129
+
130
+ ```
131
+ ⏸️ GATE 1: WORK PLAN READY
132
+
133
+ Screens: {N} | Total TC: {N} ({N} automation / {N} manual)
134
+ Scripts: {N} gen mới | {N} update | {N} skip
135
+ Repo mapping: {ScreenID} → {repo}
136
+
137
+ → Type APPROVED to proceed to Gate 2 (Script Sync)
138
+ → Type REPO: {ScreenID}={repo} để cập nhật repo mapping
139
+ ```
140
+
141
+ Dừng. Chờ APPROVED.
142
+
143
+ ---
144
+
145
+ ## ⛩️ GATE 2 — Script Sync
146
+
147
+ Chỉ chạy sau Gate 1 APPROVED.
148
+
149
+ ### Invoke script-sync skill
150
+
151
+ Gọi `script-sync` skill với context:
152
+ - `tcFile`: path TC file
153
+ - `repo`: từ Gate 1
154
+ - `screenId`: always lowercase ScreenID (vd `ad10`, not `AD10`) — directory path uses lowercase
155
+ - `screenUrl`: hỏi tester nếu chưa biết: "URL path của màn hình {ScreenID} là gì? (vd `/admin/products/create`)"
156
+ - `baseUrl`: từ `BASE_URL` env var
157
+
158
+ Nhận về: danh sách kết quả per TC.
159
+
160
+ ### Hiển thị kết quả
161
+
162
+ ```
163
+ ⏸️ GATE 2: SCRIPT SYNC COMPLETE
164
+
165
+ Gen mới: {N} | Updated: {N} | Skipped: {N}
166
+ Manual (Untest): {N} TCs
167
+ Blocked: {N} TCs — xem lý do bên trên
168
+
169
+ → Review: [ak-test/{repo}/scripts/{screenId}/{ScreenID}.spec.ts](ak-test/{repo}/scripts/{screenId}/{ScreenID}.spec.ts)
170
+ → Type APPROVED to run tests
171
+ → Type SKIP: {TC_ID} để đánh dấu Pending và tiếp tục
172
+ → Or provide feedback to fix scripts
173
+ ```
174
+
175
+ Dừng. Chờ APPROVED.
176
+
177
+ Khi tester gõ `SKIP: AD10_019`: đánh dấu TC đó là Pending, loại khỏi danh sách sẽ chạy.
178
+
179
+ ---
180
+
181
+ ## ⛩️ GATE 3 — Execute & Evidence
182
+
183
+ Chỉ chạy sau Gate 2 APPROVED.
184
+
185
+ ### Bước 1: Xác định run number
186
+
187
+ Scan `ak-test/{repo}/results/{screenId}/` để tìm run folder hiện có:
188
+ - Nếu không có folder nào → `run-1`
189
+ - Nếu có `run-1`, `run-2` → `run-3`
190
+
191
+ Tạo folder: `ak-test/{repo}/results/{screenId}/run-{N}/`
192
+
193
+ ### Bước 2: Chạy Playwright
194
+
195
+ ```bash
196
+ cd ak-test/{repo}
197
+ BASE_URL={baseUrl} npx playwright test scripts/{screenId}/{ScreenID}.spec.ts
198
+ ```
199
+
200
+ Note: Reporters are already configured in `playwright.config.ts` (json → `test-results/results.json`, html, list). The CLI `--reporter` flag would override these settings, so it is omitted here.
201
+
202
+ ### Bước 3: Parse kết quả
203
+
204
+ Đọc `ak-test/{repo}/test-results/results.json` (Playwright JSON output).
205
+
206
+ Với mỗi test:
207
+ - Extract TC_ID từ test title (format: `AD10_001 - {name}` hoặc `[AD10_001] {name}`)
208
+ - Map: TC_ID → `{status: 'passed'|'failed', duration, attachments, errors}`
209
+
210
+ ### Bước 4: Tổ chức Evidence
211
+
212
+ Với mỗi TC:
213
+
214
+ **Tạo folder:** `ak-test/{repo}/results/{screenId}/run-{N}/{TC_ID}-{kebab-scenario}/`
215
+
216
+ Với `kebab-scenario` = Test Case Name lowercase, dấu cách thành `-`, bỏ ký tự đặc biệt.
217
+
218
+ **Copy files từ Playwright output:**
219
+ - Screenshots → `step-NN-{desc}.png`
220
+ - Trace file → `trace.zip`
221
+
222
+ **Tạo `result.md`:**
223
+
224
+ Khi PASS:
225
+ ```markdown
226
+ # Result: {TC_ID} — {Test Case Name}
227
+
228
+ **Status:** ✅ PASS
229
+ **Duration:** {X}s
230
+ **Run:** run-{N} | {YYYY-MM-DD HH:MM}
231
+
232
+ ## Evidence
233
+ | Step | Screenshot |
234
+ |------|-----------|
235
+ | {step 1} | step-01-{desc}.png |
236
+ | {step 2} | step-02-{desc}.png |
237
+ ```
238
+
239
+ Khi FAIL:
240
+ ```markdown
241
+ # Result: {TC_ID} — {Test Case Name}
242
+
243
+ **Status:** ❌ FAIL
244
+ **Duration:** {X}s
245
+ **Run:** run-{N} | {YYYY-MM-DD HH:MM}
246
+
247
+ ## Failure Details
248
+ **Error:** {error message từ Playwright}
249
+
250
+ ## Evidence
251
+ | File | Mô tả |
252
+ |------|-------|
253
+ | failure-screenshot.png | Trạng thái lúc fail |
254
+ | trace.zip | Playwright trace |
255
+
256
+ ## Bug Reference
257
+ → Xem: bugs/BUG-{NNN}-{slug}.md
258
+ ```
259
+
260
+ Với Manual TCs (Untest): không tạo evidence folder.
261
+
262
+ ### Bước 5: Auto-draft Bug Reports
263
+
264
+ Với mỗi TC failed, tạo `ak-test/{repo}/results/{screenId}/run-{N}/bugs/BUG-{NNN}-{slug}.md`:
265
+
266
+ ```markdown
267
+ # BUG-{NNN} — {Test Case Name}
268
+
269
+ **TC_ID:** {TC_ID}
270
+ **Severity:** {severity từ TC file}
271
+ **Status:** 🔴 Open
272
+ **Found at:** Gate 3 Execution | {YYYY-MM-DD}
273
+ **Environment:** {baseUrl} | Chrome | Windows
274
+
275
+ ---
276
+
277
+ ## Steps to Reproduce
278
+
279
+ {Steps từ TC file, numbered}
280
+
281
+ ## Expected Result
282
+
283
+ {Expected Result từ TC file}
284
+
285
+ ## Actual Result
286
+
287
+ {Actual behavior từ Playwright error}
288
+
289
+ ## Evidence
290
+
291
+ - Screenshot: `{TC_ID}-{scenario}/failure-screenshot.png`
292
+ - Playwright trace: `{TC_ID}-{scenario}/trace.zip`
293
+
294
+ ## Technical Notes
295
+
296
+ ```
297
+ {Playwright error message}
298
+ ```
299
+
300
+ ---
301
+
302
+ ## Resolution
303
+
304
+ - [ ] Dev fix
305
+ - [ ] Retest: `RETEST: {TC_ID}`
306
+ ```
307
+
308
+ BUG số: đếm file trong `bugs/` folder, +1. Format: `001`, `002`,...
309
+
310
+ ### Bước 6: Cập nhật TC file gốc
311
+
312
+ Ghi kết quả vào các cột R1/R2 trong TC file:
313
+
314
+ - R1 = lần chạy đầu tiên (run-1). Nếu R1 đã có giá trị → ghi vào R2.
315
+ - R1 Tester = `AI-R1`, R2 Tester = `AI-R2`
316
+
317
+ ```markdown
318
+ | AD10_001 | ... | ✅ Pass | {YYYY-MM-DD} | AI-R1 | | | |
319
+ | AD10_005 | ... | ❌ Fail | {YYYY-MM-DD} | AI-R1 | | | |
320
+ | AD10_023 | ... | ⏭️ Untest | - | - | | | |
321
+ ```
322
+
323
+ Cập nhật Section 2 — Test Execution Summary table:
324
+
325
+ ```markdown
326
+ | Round {N} | {passed} | {failed} | {untest} | {pending} | {total} | {passed/total*100}% |
327
+ ```
328
+
329
+ ### Bước 7: Hiển thị Gate 3
330
+
331
+ ```
332
+ ⏸️ GATE 3: EXECUTION COMPLETE
333
+
334
+ Results (run-{N}):
335
+ - Passed: {N} / {total automation}
336
+ - Failed: {N} / {total automation}
337
+ - Untest: {N} (manual TCs)
338
+ - Pending: {N} (blocked/skipped)
339
+
340
+ Bugs drafted: {N} ({N} Critical, {N} High, {N} Medium, {N} Low)
341
+ Unresolved critical: {N}
342
+
343
+ → Evidence: ak-test/{repo}/results/{screenId}/run-{N}/
344
+ → Type APPROVED when all critical/high bugs resolved
345
+ → Type RETEST: {TC_ID} to re-execute
346
+ → Type PENDING: {TC_ID} để đánh dấu TC không chạy được
347
+ ```
348
+
349
+ Dừng. Chờ APPROVED.
350
+
351
+ ### RETEST loop
352
+
353
+ Khi tester gõ `RETEST: AD10_005, AD10_008`:
354
+
355
+ 1. **Re-run Dev Artifacts Check**: invoke `pr-impact-analysis` skill nếu PR đã khai báo.
356
+ - Nếu phát hiện commit mới → đề xuất TC bổ sung, tester approve delta trước
357
+ 2. **Chạy selective test:**
358
+ ```bash
359
+ cd ak-test/{repo}
360
+ BASE_URL={baseUrl} npx playwright test --grep "AD10_005|AD10_008"
361
+ ```
362
+ 3. Xác định run number mới (run-{N+1})
363
+ 4. Tổ chức evidence vào `run-{N+1}/` (không xóa run cũ)
364
+ 5. Cập nhật R2 columns trong TC file
365
+ 6. Cập nhật bug status:
366
+ - TC pass sau retest → ghi `RESOLVED` vào bug file: `**Status:** ✅ Resolved`
367
+ - TC vẫn fail → ghi `**Retest {N}:** Still OPEN` vào bug file
368
+
369
+ Khi tester gõ `PENDING: AD10_025`: cập nhật TC row với `⏳ Pending`.
370
+
371
+ ---
372
+
373
+ ## ⛩️ GATE 4 — Report & Bug Logging
374
+
375
+ Chỉ chạy sau Gate 3 APPROVED.
376
+
377
+ ### Bước 1: Tổng hợp kết quả
378
+
379
+ Đọc tất cả `result.md` trong `run-{N}/`:
380
+ - Count passed/failed/untest/pending per run
381
+ - Identify last run number (run-{max})
382
+
383
+ Đọc `bugs/BUG-*.md` trong run folder: phân loại severity + status (Open/Resolved).
384
+
385
+ ### Bước 2: Cập nhật Section 2 trong TC file
386
+
387
+ Cập nhật bảng Test Execution Summary với số liệu từ R1 và R2.
388
+
389
+ ### Bước 3: Sinh testreport.md
390
+
391
+ Tạo `ak-test/{repo}/results/{screenId}/run-{N}/testreport.md` theo template chuẩn:
392
+
393
+ ```markdown
394
+ # SUMMARY TEST REPORT
395
+
396
+ ## Project Information
397
+ | Property | Value | Property | Value |
398
+ |:---|:---|:---|:---|
399
+ | Project Name | {tên dự án từ TC file hoặc hỏi tester} | Author | AI |
400
+ | Project Code | {ScreenID} | Reviewer | {tên tester} |
401
+ | Created At | {ngày chạy R1} | Report Date | {hôm nay} |
402
+ | Last updated at | {hôm nay} | | |
403
+
404
+ ## Test Execution Summary
405
+ | No | Module code | Written By | Created Date | R1 Passed | R1 Failed | R1 UnTest | R1 Pending | R2 Passed | R2 Failed | R2 UnTest | R2 Pending | Blocked | Total test cases | Tổng passed | % hoàn thành | Created Date | Updated Date | Sprint | Creator | Reviewer / Approver |
406
+ |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
407
+ | 1 | {ScreenID} | AI | {date} | {r1p} | {r1f} | {r1u} | {r1pe} | {r2p} | {r2f} | {r2u} | {r2pe} | {blocked} | {total} | {tổng passed} | {%} | {date} | {date} | {sprint nếu có} | AI | {tester} |
408
+
409
+ ## Bug Summary
410
+ | Bug ID | Severity | Title | Status | Jira Ticket |
411
+ |--------|----------|-------|--------|-------------|
412
+ {rows từ bugs/}
413
+
414
+ ## Sign-off
415
+ - **Recommendation:** {Go nếu 0 Critical+High Open / No-go nếu còn / Conditional go nếu chỉ Medium còn open}
416
+ - **Conditions:** {liệt kê nếu Conditional}
417
+ ```
418
+
419
+ **Exit criteria:**
420
+ - 0 Critical bugs Open → Go (kể cả còn Medium/Low)
421
+ - 0 High bugs Open → Go (nếu không có Critical)
422
+ - Còn Critical hoặc High Open → No-go
423
+ - Chỉ còn Medium/Low Open → Conditional go
424
+
425
+ ### Bước 4: Bug logging flow
426
+
427
+ Hỏi từng bug theo thứ tự severity (Critical → High → Medium → Low):
428
+
429
+ ```
430
+ 🐛 BUG-{NNN} [{Severity}] — {Title}
431
+ TC: {TC_ID} | Evidence: run-{N}/bugs/BUG-{NNN}...
432
+ Steps: {steps tóm tắt}
433
+ Expected: {expected}
434
+ Actual: {actual}
435
+
436
+ → Log lên Jira? [Y/n] (hoặc gõ SKIP-BUG để bỏ qua)
437
+ ```
438
+
439
+ Nếu tester gõ `Y`:
440
+ - Gọi `ak bug-log` (nếu adapter có) hoặc hướng dẫn tester copy nội dung
441
+ - Ghi ticket ID vào bug file: `**Jira Ticket:** {ticket-id}`
442
+ - Ghi ticket ID vào cột Ticket ID của TC trong TC file
443
+
444
+ Nếu `n` hoặc `SKIP-BUG`: ghi `Not logged` trong testreport.md Bug Summary.
445
+
446
+ ### Bước 5: Hiển thị Gate 4
447
+
448
+ ```
449
+ ⏸️ GATE 4: REPORT READY
450
+
451
+ Overall: {Pass / Fail / Conditional}
452
+ Passed: {N}/{total} | % hoàn thành: {N}%
453
+ Bugs logged to Jira: {N}/{total bugs}
454
+ Recommendation: {Go / No-go / Conditional go}
455
+
456
+ → Review: [ak-test/{repo}/results/{screenId}/run-{N}/testreport.md](ak-test/{repo}/results/{screenId}/run-{N}/testreport.md)
457
+ → Type APPROVED to sign off
458
+ → Type NO-GO: {reason} to reject release
459
+ ```
460
+
461
+ Dừng. Chờ APPROVED hoặc NO-GO.
462
+
463
+ ---
464
+
465
+ ## Commands Reference
466
+
467
+ ```
468
+ # Entry points
469
+ ak execute PROJ-33 # từ ticket
470
+ ak execute ./testcases/AD10.md # từ file
471
+ ak execute # manual
472
+
473
+ # Gate 1
474
+ REPO: AD10=repo-fe, API01=repo-be # cập nhật repo mapping
475
+
476
+ # Gate 2
477
+ SKIP: {TC_ID} # đánh dấu Pending, bỏ qua script
478
+
479
+ # Gate 3
480
+ RETEST: {TC_ID} # re-execute 1 TC
481
+ RETEST: {TC_ID1}, {TC_ID2} # re-execute nhiều TCs
482
+ PENDING: {TC_ID} # đánh dấu không chạy được
483
+
484
+ # Gate approval
485
+ APPROVED # chuyển gate tiếp theo
486
+ NO-GO: {reason} # reject (chỉ Gate 4)
487
+ SKIP-BUG: BUG-{NNN} # bỏ qua không log bug này
488
+ ```
489
+
490
+ ---
491
+
492
+ ## Mandatory Rules
493
+
494
+ - ✅ Dừng ở mỗi gate, chờ APPROVED trước khi proceed
495
+ - ✅ `run-{N}` không bao giờ bị xóa hay overwrite — luôn tạo folder mới
496
+ - ✅ R1/R2 trong TC file gốc được cập nhật sau mỗi lần chạy
497
+ - ✅ Hỏi từng bug một — không auto-log toàn bộ
498
+ - ❌ Không lấy expected result từ PR/code — chỉ từ TC file
499
+ - ❌ Không skip gate kể cả khi "chỉ có 1 TC"
@@ -0,0 +1,39 @@
1
+ import { defineConfig, devices } from '@playwright/test'
2
+ import path from 'path'
3
+
4
+ const LOGGED_OUT = { storageState: undefined }
5
+
6
+ export default defineConfig({
7
+ testDir: './scripts',
8
+ outputDir: './test-results',
9
+ fullyParallel: false,
10
+ forbidOnly: !!process.env.CI,
11
+ retries: process.env.CI ? 1 : 0,
12
+ workers: 1,
13
+ reporter: [
14
+ ['json', { outputFile: 'test-results/results.json' }],
15
+ ['html', { outputFolder: 'playwright-report', open: 'never' }],
16
+ ['list'],
17
+ ],
18
+ use: {
19
+ baseURL: process.env.BASE_URL || 'http://localhost:3000',
20
+ trace: 'on-first-retry',
21
+ screenshot: 'on',
22
+ video: 'on-first-retry',
23
+ headless: !process.env.HEADED,
24
+ },
25
+ projects: [
26
+ // Uncomment nếu cần auth setup:
27
+ // { name: 'setup', testMatch: /auth\.setup\.ts/ },
28
+ {
29
+ name: 'chromium',
30
+ use: {
31
+ ...devices['Desktop Chrome'],
32
+ // storageState: '.auth/user.json', // uncomment nếu cần auth
33
+ },
34
+ // dependencies: ['setup'], // uncomment nếu cần auth
35
+ },
36
+ ],
37
+ })
38
+
39
+ export { LOGGED_OUT }