@relipa/ai-flow-kit 0.1.4-beta.0 → 0.1.4
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/README.md +185 -136
- package/custom/skills/execute-flow/SKILL.md +5 -34
- package/custom/skills/gate-review/SKILL.md +29 -105
- package/custom/skills/generate-testcase/SKILL.md +0 -8
- package/custom/skills/generate-testcase/templates/testcase.md +50 -59
- package/custom/skills/test-analysis/SKILL.md +0 -4
- package/custom/skills/test-skills/template/template_testcase.md +50 -59
- package/custom/templates/shared/create-spec-workflow.md +0 -6
- package/docs/common/CHANGELOG.md +47 -0
- package/package.json +1 -1
- package/scripts/review.js +83 -46
|
@@ -18,75 +18,66 @@ Tài liệu này cung cấp **Template Test Case** chuẩn chỉnh và hướng
|
|
|
18
18
|
| **Người kiểm duyệt (Reviewer)** | [Ví dụ: Nguyễn Văn A] |
|
|
19
19
|
| **Ngày kiểm duyệt (Review Date)** | [Ví dụ: 2026-06-16] |
|
|
20
20
|
|
|
21
|
-
## 2.
|
|
21
|
+
## 2. Danh sách Test Cases Chi Tiết
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|:---|:---:|:---:|:---:|:---:|:---:|:---:|
|
|
25
|
-
| Round 1 | 0 | 0 | 0 | 0 | 0 | 0% |
|
|
26
|
-
| Round 2 | 0 | 0 | 0 | 0 | 0 | 0% |
|
|
23
|
+
### 2.1. Kiểm thử truy cập & Phân quyền (Access & Authorization)
|
|
27
24
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
| Test Case ID | Test Case Name | Severity | Pre-condition | Steps | Data Test | Expected Result | Ticket ID | Comment | R1 Result | R1 Date | R1 Tester | R2 Result | R2 Date | R2 Tester |
|
|
35
|
-
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
36
|
-
| [ID_001] | Truy cập trực tiếp qua URL khi chưa đăng nhập | High | Người dùng chưa đăng nhập hệ thống | 1. Nhập URL màn hình vào thanh địa chỉ trình duyệt.<br>2. Nhấn Enter. | URL của màn hình | Hệ thống không cho phép truy cập.<br>Tự động chuyển hướng về trang Đăng nhập (Login). | | | | | | | | |
|
|
37
|
-
| [ID_002] | Truy cập trực tiếp qua URL khi đã đăng nhập | Medium | Người dùng đã đăng nhập hệ thống thành công | 1. Nhập URL màn hình vào thanh địa chỉ trình duyệt.<br>2. Nhấn Enter. | URL của màn hình | Hệ thống cho phép truy cập.<br>Hiển thị đúng giao diện màn hình. | | | | | | | | |
|
|
38
|
-
| [ID_003] | Truy cập qua button/menu điều hướng | Low | Người dùng đang ở màn hình danh sách | 1. Click vào nút "Thêm mới" hoặc menu tương ứng. | - | Hệ thống mở màn hình đăng ký/thực hiện tương ứng thành công. | | | | | | | | |
|
|
25
|
+
| Test Case ID | Test Case Name | Severity | Pre-condition | Steps | Data Test | Expected Result | Ticket ID | Comment |
|
|
26
|
+
|---|---|---|---|---|---|---|---|---|
|
|
27
|
+
| [ID_001] | Truy cập trực tiếp qua URL khi chưa đăng nhập | High | Người dùng chưa đăng nhập hệ thống | 1. Nhập URL màn hình vào thanh địa chỉ trình duyệt.<br>2. Nhấn Enter. | URL của màn hình | Hệ thống không cho phép truy cập.<br>Tự động chuyển hướng về trang Đăng nhập (Login). | | |
|
|
28
|
+
| [ID_002] | Truy cập trực tiếp qua URL khi đã đăng nhập | Medium | Người dùng đã đăng nhập hệ thống thành công | 1. Nhập URL màn hình vào thanh địa chỉ trình duyệt.<br>2. Nhấn Enter. | URL của màn hình | Hệ thống cho phép truy cập.<br>Hiển thị đúng giao diện màn hình. | | |
|
|
29
|
+
| [ID_003] | Truy cập qua button/menu điều hướng | Low | Người dùng đang ở màn hình danh sách | 1. Click vào nút "Thêm mới" hoặc menu tương ứng. | - | Hệ thống mở màn hình đăng ký/thực hiện tương ứng thành công. | | |
|
|
39
30
|
|
|
40
|
-
###
|
|
31
|
+
### 2.2. Kiểm thử Giao diện Người dùng (UI/UX)
|
|
41
32
|
|
|
42
|
-
| Test Case ID | Test Case Name | Severity | Pre-condition | Steps | Data Test | Expected Result | Ticket ID | Comment |
|
|
43
|
-
|
|
44
|
-
| [ID_004] | Kiểm tra hiển thị giao diện tổng quan | Low | Màn hình hiển thị bình thường | 1. Quan sát giao diện màn hình.<br>2. Kiểm tra layout, màu sắc, font chữ, khoảng cách giữa các trường. | - | 1. Layout cân đối, font chữ và cỡ chữ đồng nhất.<br>2. Các trường bắt buộc nhập có dấu sao đỏ (*).<br>3. Không có lỗi chính tả, lỗi dịch thuật tiếng Nhật/Anh/Việt.<br>4. Định dạng placeholder hiển thị chính xác theo thiết kế. | | |
|
|
33
|
+
| Test Case ID | Test Case Name | Severity | Pre-condition | Steps | Data Test | Expected Result | Ticket ID | Comment |
|
|
34
|
+
|---|---|---|---|---|---|---|---|---|
|
|
35
|
+
| [ID_004] | Kiểm tra hiển thị giao diện tổng quan | Low | Màn hình hiển thị bình thường | 1. Quan sát giao diện màn hình.<br>2. Kiểm tra layout, màu sắc, font chữ, khoảng cách giữa các trường. | - | 1. Layout cân đối, font chữ và cỡ chữ đồng nhất.<br>2. Các trường bắt buộc nhập có dấu sao đỏ (*).<br>3. Không có lỗi chính tả, lỗi dịch thuật tiếng Nhật/Anh/Việt.<br>4. Định dạng placeholder hiển thị chính xác theo thiết kế. | | |
|
|
45
36
|
|
|
46
|
-
###
|
|
37
|
+
### 2.3. Kiểm thử Validation các trường nhập liệu (Input Validation)
|
|
47
38
|
*(Tạo riêng từng bảng hoặc nhóm theo từng Field để dễ theo dõi)*
|
|
48
39
|
|
|
49
40
|
#### * Đối với Trường nhập liệu Text (Ví dụ: 【品番】/【品名】...)
|
|
50
|
-
| Test Case ID | Test Case Name | Severity | Pre-condition | Steps | Data Test | Expected Result | Ticket ID | Comment |
|
|
51
|
-
|
|
52
|
-
| [ID_005] | Kiểm tra giá trị mặc định | Low | Đã truy cập màn hình | 1. Quan sát trường [Tên Trường]. | - | Giá trị mặc định là trống (blank).<br>Hiển thị đúng Placeholder thiết kế. | | |
|
|
53
|
-
| [ID_006] | Kiểm tra trường bắt buộc nhập để trống | High | Đã truy cập màn hình | 1. Để trống trường [Tên Trường].<br>2. Bấm nút thực hiện (Đăng ký/Lưu). | Empty | 1. Hiển thị thông báo lỗi trên đầu trang hoặc dưới field: "Hãy nhập [Tên Trường]" (tiếng Nhật/Anh tương ứng).<br>2. Field bị highlight viền đỏ. | | |
|
|
54
|
-
| [ID_007] | Kiểm tra nhập ký tự khoảng trắng (Spaces) | Medium | Đã truy cập màn hình | 1. Nhập toàn khoảng trắng vào trường.<br>2. Bấm nút thực hiện (Đăng ký/Lưu) hoặc focus out. | `" "` | Hệ thống xem như để trống.<br>Báo lỗi bắt buộc nhập (nếu là trường Required) hoặc tự động trim khoảng trắng. | | |
|
|
55
|
-
| [ID_008] | Kiểm tra nhập khoảng trắng ở đầu/cuối chuỗi | Low | Đã truy cập màn hình | 1. Nhập chuỗi có khoảng trắng ở đầu/cuối.<br>2. Bấm nút thực hiện (Đăng ký/Lưu). | `" data_test "` | Hệ thống tự động cắt bỏ (trim) khoảng trắng ở đầu và cuối chuỗi trước khi lưu vào DB. | | |
|
|
56
|
-
| [ID_009] | Kiểm tra nhập độ dài tối thiểu/tối đa (Boundary Value) | Medium | Đã truy cập màn hình, biết Maxlength = N | 1. Nhập chuỗi có độ dài N - 1 ký tự.<br>2. Nhập chuỗi có độ dài N ký tự.<br>3. Nhập chuỗi có độ dài > N ký tự. | Chuỗi test tương ứng | - Với độ dài <= N: Cho phép nhập và lưu bình thường.<br>- Với độ dài > N: Hệ thống chặn trực tiếp trên UI (không cho gõ tiếp) hoặc báo lỗi hợp lệ. | | |
|
|
57
|
-
| [ID_010] | Kiểm tra nhập ký tự đặc biệt / Tiếng Nhật Halfwidth & Fullwidth | Medium | Đã truy cập màn hình | 1. Nhập các ký tự đặc biệt (!@#$).<br>2. Nhập ký tự Halfwidth (カタカナ, 123).<br>3. Nhập ký tự Fullwidth (カタカナ, 123). | Dữ liệu kiểm thử | Hệ thống lưu trữ đúng định dạng ký tự đã nhập (hoặc báo lỗi chuẩn nếu có quy định hạn chế định dạng). | | |
|
|
58
|
-
| [ID_011] | Kiểm tra thao tác Copy/Paste | Low | Đã truy cập màn hình | 1. Copy một chuỗi hợp lệ.<br>2. Paste vào trường thông tin.<br>3. Bấm nút thực hiện. | - | Cho phép paste dữ liệu vào field thành công và xử lý lưu bình thường. | | |
|
|
41
|
+
| Test Case ID | Test Case Name | Severity | Pre-condition | Steps | Data Test | Expected Result | Ticket ID | Comment |
|
|
42
|
+
|---|---|---|---|---|---|---|---|---|
|
|
43
|
+
| [ID_005] | Kiểm tra giá trị mặc định | Low | Đã truy cập màn hình | 1. Quan sát trường [Tên Trường]. | - | Giá trị mặc định là trống (blank).<br>Hiển thị đúng Placeholder thiết kế. | | |
|
|
44
|
+
| [ID_006] | Kiểm tra trường bắt buộc nhập để trống | High | Đã truy cập màn hình | 1. Để trống trường [Tên Trường].<br>2. Bấm nút thực hiện (Đăng ký/Lưu). | Empty | 1. Hiển thị thông báo lỗi trên đầu trang hoặc dưới field: "Hãy nhập [Tên Trường]" (tiếng Nhật/Anh tương ứng).<br>2. Field bị highlight viền đỏ. | | |
|
|
45
|
+
| [ID_007] | Kiểm tra nhập ký tự khoảng trắng (Spaces) | Medium | Đã truy cập màn hình | 1. Nhập toàn khoảng trắng vào trường.<br>2. Bấm nút thực hiện (Đăng ký/Lưu) hoặc focus out. | `" "` | Hệ thống xem như để trống.<br>Báo lỗi bắt buộc nhập (nếu là trường Required) hoặc tự động trim khoảng trắng. | | |
|
|
46
|
+
| [ID_008] | Kiểm tra nhập khoảng trắng ở đầu/cuối chuỗi | Low | Đã truy cập màn hình | 1. Nhập chuỗi có khoảng trắng ở đầu/cuối.<br>2. Bấm nút thực hiện (Đăng ký/Lưu). | `" data_test "` | Hệ thống tự động cắt bỏ (trim) khoảng trắng ở đầu và cuối chuỗi trước khi lưu vào DB. | | |
|
|
47
|
+
| [ID_009] | Kiểm tra nhập độ dài tối thiểu/tối đa (Boundary Value) | Medium | Đã truy cập màn hình, biết Maxlength = N | 1. Nhập chuỗi có độ dài N - 1 ký tự.<br>2. Nhập chuỗi có độ dài N ký tự.<br>3. Nhập chuỗi có độ dài > N ký tự. | Chuỗi test tương ứng | - Với độ dài <= N: Cho phép nhập và lưu bình thường.<br>- Với độ dài > N: Hệ thống chặn trực tiếp trên UI (không cho gõ tiếp) hoặc báo lỗi hợp lệ. | | |
|
|
48
|
+
| [ID_010] | Kiểm tra nhập ký tự đặc biệt / Tiếng Nhật Halfwidth & Fullwidth | Medium | Đã truy cập màn hình | 1. Nhập các ký tự đặc biệt (!@#$).<br>2. Nhập ký tự Halfwidth (カタカナ, 123).<br>3. Nhập ký tự Fullwidth (カタカナ, 123). | Dữ liệu kiểm thử | Hệ thống lưu trữ đúng định dạng ký tự đã nhập (hoặc báo lỗi chuẩn nếu có quy định hạn chế định dạng). | | |
|
|
49
|
+
| [ID_011] | Kiểm tra thao tác Copy/Paste | Low | Đã truy cập màn hình | 1. Copy một chuỗi hợp lệ.<br>2. Paste vào trường thông tin.<br>3. Bấm nút thực hiện. | - | Cho phép paste dữ liệu vào field thành công và xử lý lưu bình thường. | | |
|
|
59
50
|
|
|
60
51
|
#### * Đối với Trường Số (Number / Price / Quantity)
|
|
61
|
-
| Test Case ID | Test Case Name | Severity | Pre-condition | Steps | Data Test | Expected Result | Ticket ID | Comment |
|
|
62
|
-
|
|
63
|
-
| [ID_012] | Kiểm tra nhập chữ cái và ký tự đặc biệt | Medium | Đã truy cập màn hình | 1. Cố gắng nhập chữ cái (a, b, c...) hoặc ký tự đặc biệt.<br>2. Bấm nút thực hiện. | `"abc"`, `"@#$"` | UI ngăn không cho nhập chữ cái/ký tự đặc biệt, chỉ chấp nhận chữ số. | | |
|
|
64
|
-
| [ID_013] | Kiểm tra nhập số âm | High | Đã truy cập màn hình | 1. Nhập số âm.<br>2. Bấm nút thực hiện. | `-10` | Báo lỗi giá trị phải lớn hơn hoặc bằng 0 (hoặc chặn dấu trừ `-` trực tiếp từ UI). | | |
|
|
65
|
-
| [ID_014] | Kiểm tra nhập số thập phân | High | Đã truy cập màn hình | 1. Nhập số có dấu phẩy thập phân.<br>2. Bấm nút thực hiện. | `1.5`, `2,3` | Báo lỗi chỉ chấp nhận số nguyên (hoặc chấp nhận số thập phân tùy đặc tả nghiệp vụ). | | |
|
|
66
|
-
| [ID_015] | Kiểm tra hiển thị định dạng phân tách hàng nghìn | Low | Đã truy cập màn hình | 1. Nhập số lớn.<br>2. Focus out khỏi trường nhập liệu. | `1000000` | Số tự động định dạng phân tách hàng nghìn (Ví dụ: `1,000,000`). | | |
|
|
52
|
+
| Test Case ID | Test Case Name | Severity | Pre-condition | Steps | Data Test | Expected Result | Ticket ID | Comment |
|
|
53
|
+
|---|---|---|---|---|---|---|---|---|
|
|
54
|
+
| [ID_012] | Kiểm tra nhập chữ cái và ký tự đặc biệt | Medium | Đã truy cập màn hình | 1. Cố gắng nhập chữ cái (a, b, c...) hoặc ký tự đặc biệt.<br>2. Bấm nút thực hiện. | `"abc"`, `"@#$"` | UI ngăn không cho nhập chữ cái/ký tự đặc biệt, chỉ chấp nhận chữ số. | | |
|
|
55
|
+
| [ID_013] | Kiểm tra nhập số âm | High | Đã truy cập màn hình | 1. Nhập số âm.<br>2. Bấm nút thực hiện. | `-10` | Báo lỗi giá trị phải lớn hơn hoặc bằng 0 (hoặc chặn dấu trừ `-` trực tiếp từ UI). | | |
|
|
56
|
+
| [ID_014] | Kiểm tra nhập số thập phân | High | Đã truy cập màn hình | 1. Nhập số có dấu phẩy thập phân.<br>2. Bấm nút thực hiện. | `1.5`, `2,3` | Báo lỗi chỉ chấp nhận số nguyên (hoặc chấp nhận số thập phân tùy đặc tả nghiệp vụ). | | |
|
|
57
|
+
| [ID_015] | Kiểm tra hiển thị định dạng phân tách hàng nghìn | Low | Đã truy cập màn hình | 1. Nhập số lớn.<br>2. Focus out khỏi trường nhập liệu. | `1000000` | Số tự động định dạng phân tách hàng nghìn (Ví dụ: `1,000,000`). | | |
|
|
67
58
|
|
|
68
59
|
#### * Đối với Trường File Upload (Hình ảnh)
|
|
69
|
-
| Test Case ID | Test Case Name | Severity | Pre-condition | Steps | Data Test | Expected Result | Ticket ID | Comment |
|
|
70
|
-
|
|
71
|
-
| [ID_016] | Kiểm tra không upload file (Trường tùy chọn) | Medium | Đã truy cập màn hình | 1. Không chọn file upload.<br>2. Bấm nút thực hiện. | - | Hệ thống cho phép thực hiện thành công mà không báo lỗi. | | |
|
|
72
|
-
| [ID_017] | Kiểm tra upload file sai định dạng | High | Định dạng cho phép: jpeg, png | 1. Chọn upload file có định dạng không được phép (xlsx, gif, pdf...). | File `.pdf`, `.xlsx` | Upload không thành công. Hiển thị thông báo lỗi đúng thiết kế: "Hình ảnh phải là định dạng jpeg hoặc png." | | |
|
|
73
|
-
| [ID_018] | Kiểm tra upload dung lượng vượt quá giới hạn | High | Giới hạn dung lượng: tối đa 10MB | 1. Chọn file có kích thước > 10MB.<br>2. Tiến hành upload. | File kích thước `10.5MB` | Upload thất bại. Hiển thị lỗi cảnh báo: "Dung lượng hình ảnh vượt quá 10MB." | | |
|
|
74
|
-
| [ID_019] | Kiểm tra upload file giả mạo đuôi mở rộng (Spoofing) | High | Đã truy cập màn hình | 1. Đổi đuôi file thực thi nguy hiểm `.exe` thành `.jpg`.<br>2. Chọn upload file này. | File `.exe` đổi tên thành `.jpg` | Hệ thống kiểm tra phần thân file (MIME type) thực tế và báo lỗi không đúng định dạng. | | |
|
|
75
|
-
| [ID_020] | Kiểm tra kéo thả file (Drag & Drop) | Low | Đã truy cập màn hình | 1. Kéo file ảnh thả vào vùng upload. | File `.png` hợp lệ | Upload file thành công và hiển thị thumbnail ảnh xem trước trên giao diện. | | |
|
|
76
|
-
|
|
77
|
-
###
|
|
78
|
-
|
|
79
|
-
| Test Case ID | Test Case Name | Severity | Pre-condition | Steps | Data Test | Expected Result | Ticket ID | Comment |
|
|
80
|
-
|
|
81
|
-
| [ID_021] | Kiểm tra ràng buộc trùng lặp dữ liệu duy nhất (Unique) | High | Đã tồn tại bản ghi trong DB | 1. Nhập thông tin trùng khóa chính/mã duy nhất với bản ghi cũ.<br>2. Điền các thông tin hợp lệ khác.<br>3. Bấm Đăng ký. | Mã trùng lặp | Hệ thống báo lỗi trùng lặp: "Mã/Tên này đã tồn tại trong hệ thống. Vui lòng kiểm tra lại." | | |
|
|
82
|
-
| [ID_022] | Kiểm tra logic liên kết dữ liệu động (Dynamic Form Control) | High | Điều kiện thay đổi hiển thị | 1. Tích chọn/Bỏ tích chọn [Checkbox điều kiện]. | - | Giao diện tự động thay đổi hiển thị ẩn/hiện hoặc disable/enable các trường thông tin liên quan theo đúng mô tả BR. | | |
|
|
83
|
-
| [ID_023] | Kiểm tra lưu dữ liệu vào Database thành công | Critical | Nhập đầy đủ và chính xác tất cả dữ liệu hợp lệ | 1. Nhập toàn bộ dữ liệu hợp lệ.<br>2. Bấm nút Đăng ký.<br>3. Kiểm tra DB và màn hình danh sách. | Dữ liệu hợp lệ | 1. Lưu bản ghi mới thành công.<br>2. Hiển thị thông báo thành công.<br>3. Dữ liệu trong Database khớp hoàn toàn các trường thông tin đã điền trên UI. | | |
|
|
84
|
-
|
|
85
|
-
###
|
|
86
|
-
|
|
87
|
-
| Test Case ID | Test Case Name | Severity | Pre-condition | Steps | Data Test | Expected Result | Ticket ID | Comment |
|
|
88
|
-
|
|
89
|
-
| [ID_024] | Bấm nút Đăng ký nhiều lần liên tiếp (Double Click) | High | Đã điền đầy đủ dữ liệu hợp lệ | 1. Click liên tiếp nhiều lần vào nút Đăng ký/Lưu. | - | Nút bấm bị disable ngay sau lượt click đầu tiên. Hệ thống chỉ xử lý và tạo duy nhất 1 bản ghi trong DB, không tạo trùng lặp. | | |
|
|
90
|
-
| [ID_025] | Kiểm tra mất kết nối mạng đột ngột khi bấm Lưu | High | Điền đầy đủ dữ liệu hợp lệ | 1. Bấm nút Lưu.<br>2. Đồng thời ngắt kết nối mạng (hoặc giả lập mất kết nối mạng). | - | Hệ thống hiển thị loading và thông báo lỗi kết nối mạng, không bị crash hoặc treo màn hình trắng. | | |
|
|
91
|
-
| [ID_026] | Kiểm tra nhấn nút Quay lại (戻る) | Low | Đã điền một số dữ liệu | 1. Nhập một số thông tin.<br>2. Bấm nút Quay lại. | - | Hệ thống chuyển hướng về màn hình danh sách trước đó.<br>Bản ghi mới không được tạo trong DB. | | |
|
|
60
|
+
| Test Case ID | Test Case Name | Severity | Pre-condition | Steps | Data Test | Expected Result | Ticket ID | Comment |
|
|
61
|
+
|---|---|---|---|---|---|---|---|---|
|
|
62
|
+
| [ID_016] | Kiểm tra không upload file (Trường tùy chọn) | Medium | Đã truy cập màn hình | 1. Không chọn file upload.<br>2. Bấm nút thực hiện. | - | Hệ thống cho phép thực hiện thành công mà không báo lỗi. | | |
|
|
63
|
+
| [ID_017] | Kiểm tra upload file sai định dạng | High | Định dạng cho phép: jpeg, png | 1. Chọn upload file có định dạng không được phép (xlsx, gif, pdf...). | File `.pdf`, `.xlsx` | Upload không thành công. Hiển thị thông báo lỗi đúng thiết kế: "Hình ảnh phải là định dạng jpeg hoặc png." | | |
|
|
64
|
+
| [ID_018] | Kiểm tra upload dung lượng vượt quá giới hạn | High | Giới hạn dung lượng: tối đa 10MB | 1. Chọn file có kích thước > 10MB.<br>2. Tiến hành upload. | File kích thước `10.5MB` | Upload thất bại. Hiển thị lỗi cảnh báo: "Dung lượng hình ảnh vượt quá 10MB." | | |
|
|
65
|
+
| [ID_019] | Kiểm tra upload file giả mạo đuôi mở rộng (Spoofing) | High | Đã truy cập màn hình | 1. Đổi đuôi file thực thi nguy hiểm `.exe` thành `.jpg`.<br>2. Chọn upload file này. | File `.exe` đổi tên thành `.jpg` | Hệ thống kiểm tra phần thân file (MIME type) thực tế và báo lỗi không đúng định dạng. | | |
|
|
66
|
+
| [ID_020] | Kiểm tra kéo thả file (Drag & Drop) | Low | Đã truy cập màn hình | 1. Kéo file ảnh thả vào vùng upload. | File `.png` hợp lệ | Upload file thành công và hiển thị thumbnail ảnh xem trước trên giao diện. | | |
|
|
67
|
+
|
|
68
|
+
### 2.4. Kiểm thử Logic Nghiệp vụ (Business Rules - BR)
|
|
69
|
+
|
|
70
|
+
| Test Case ID | Test Case Name | Severity | Pre-condition | Steps | Data Test | Expected Result | Ticket ID | Comment |
|
|
71
|
+
|---|---|---|---|---|---|---|---|---|
|
|
72
|
+
| [ID_021] | Kiểm tra ràng buộc trùng lặp dữ liệu duy nhất (Unique) | High | Đã tồn tại bản ghi trong DB | 1. Nhập thông tin trùng khóa chính/mã duy nhất với bản ghi cũ.<br>2. Điền các thông tin hợp lệ khác.<br>3. Bấm Đăng ký. | Mã trùng lặp | Hệ thống báo lỗi trùng lặp: "Mã/Tên này đã tồn tại trong hệ thống. Vui lòng kiểm tra lại." | | |
|
|
73
|
+
| [ID_022] | Kiểm tra logic liên kết dữ liệu động (Dynamic Form Control) | High | Điều kiện thay đổi hiển thị | 1. Tích chọn/Bỏ tích chọn [Checkbox điều kiện]. | - | Giao diện tự động thay đổi hiển thị ẩn/hiện hoặc disable/enable các trường thông tin liên quan theo đúng mô tả BR. | | |
|
|
74
|
+
| [ID_023] | Kiểm tra lưu dữ liệu vào Database thành công | Critical | Nhập đầy đủ và chính xác tất cả dữ liệu hợp lệ | 1. Nhập toàn bộ dữ liệu hợp lệ.<br>2. Bấm nút Đăng ký.<br>3. Kiểm tra DB và màn hình danh sách. | Dữ liệu hợp lệ | 1. Lưu bản ghi mới thành công.<br>2. Hiển thị thông báo thành công.<br>3. Dữ liệu trong Database khớp hoàn toàn các trường thông tin đã điền trên UI. | | |
|
|
75
|
+
|
|
76
|
+
### 2.5. Kiểm thử Ngoại lệ & Hệ thống (Exceptions & Systems)
|
|
77
|
+
|
|
78
|
+
| Test Case ID | Test Case Name | Severity | Pre-condition | Steps | Data Test | Expected Result | Ticket ID | Comment |
|
|
79
|
+
|---|---|---|---|---|---|---|---|---|
|
|
80
|
+
| [ID_024] | Bấm nút Đăng ký nhiều lần liên tiếp (Double Click) | High | Đã điền đầy đủ dữ liệu hợp lệ | 1. Click liên tiếp nhiều lần vào nút Đăng ký/Lưu. | - | Nút bấm bị disable ngay sau lượt click đầu tiên. Hệ thống chỉ xử lý và tạo duy nhất 1 bản ghi trong DB, không tạo trùng lặp. | | |
|
|
81
|
+
| [ID_025] | Kiểm tra mất kết nối mạng đột ngột khi bấm Lưu | High | Điền đầy đủ dữ liệu hợp lệ | 1. Bấm nút Lưu.<br>2. Đồng thời ngắt kết nối mạng (hoặc giả lập mất kết nối mạng). | - | Hệ thống hiển thị loading và thông báo lỗi kết nối mạng, không bị crash hoặc treo màn hình trắng. | | |
|
|
82
|
+
| [ID_026] | Kiểm tra nhấn nút Quay lại (戻る) | Low | Đã điền một số dữ liệu | 1. Nhập một số thông tin.<br>2. Bấm nút Quay lại. | - | Hệ thống chuyển hướng về màn hình danh sách trước đó.<br>Bản ghi mới không được tạo trong DB. | | |
|
|
92
83
|
```
|
|
@@ -178,7 +178,6 @@ Nếu workspace mở dạng parent folder chứa cả `ak docs` lẫn source cod
|
|
|
178
178
|
|
|
179
179
|
**Nếu nhận được APPROVED mà QA(1).md còn câu hỏi Open → từ chối ngay, hiển thị:**
|
|
180
180
|
|
|
181
|
-
```
|
|
182
181
|
⛔ GATE 1 BLOCKED — Còn [N] câu hỏi chưa được trả lời trong QA(1).md.
|
|
183
182
|
|
|
184
183
|
| ID | Câu hỏi còn Open |
|
|
@@ -191,7 +190,6 @@ Vui lòng cung cấp câu trả lời theo một trong 3 cách:
|
|
|
191
190
|
→ Option C: đặt file `[functionId]_QA(1)_response.md` vào thư mục QA/ rồi gõ NEXT
|
|
192
191
|
|
|
193
192
|
❌ APPROVED không được chấp nhận cho đến khi 100% câu hỏi đã Confirmed.
|
|
194
|
-
```
|
|
195
193
|
|
|
196
194
|
**Khi APPROVED (chỉ sau khi tất cả câu hỏi trong QA(1).md đã Confirmed):**
|
|
197
195
|
→ **INVOKE** `gate-review` skill (verify mode) — chạy `ak review check --gate 1 --ticket [functionId]`
|
|
@@ -245,7 +243,6 @@ Vui lòng cung cấp câu trả lời theo một trong 3 cách:
|
|
|
245
243
|
3. **INVOKE** `gate-review` skill (generate mode) — ghi `.aiflow/review/gate-2-[functionId]-round-[m+1].md`
|
|
246
244
|
4. Hiển thị:
|
|
247
245
|
|
|
248
|
-
```
|
|
249
246
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
250
247
|
⏸️ GATE 2 — VÒNG Q&A [m+1]
|
|
251
248
|
|
|
@@ -256,13 +253,11 @@ File phân tích: [docs/ak-{project}/spec/phan-tich/[functionId]_phan-tich(n+1
|
|
|
256
253
|
→ BA điền câu trả lời và cung cấp theo một trong 3 option (A/B/C)
|
|
257
254
|
→ Sau khi cung cấp phản hồi, type NEXT để AI xử lý vòng tiếp theo
|
|
258
255
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
259
|
-
```
|
|
260
256
|
|
|
261
257
|
5. Lặp lại Bước 1 khi nhận phản hồi mới
|
|
262
258
|
|
|
263
259
|
**Nếu BA gõ APPROVED khi đang ở Kịch bản A (còn câu hỏi Open) → từ chối ngay:**
|
|
264
260
|
|
|
265
|
-
```
|
|
266
261
|
⛔ GATE 2 BLOCKED — Còn [N] câu hỏi chưa Confirmed.
|
|
267
262
|
|
|
268
263
|
| ID | Câu hỏi còn Open |
|
|
@@ -271,7 +266,6 @@ File phân tích: [docs/ak-{project}/spec/phan-tich/[functionId]_phan-tich(n+1
|
|
|
271
266
|
|
|
272
267
|
→ Cung cấp câu trả lời (Option A/B/C) rồi gõ NEXT để AI xử lý tiếp.
|
|
273
268
|
❌ APPROVED chỉ được chấp nhận khi 100% câu hỏi đã Confirmed.
|
|
274
|
-
```
|
|
275
269
|
|
|
276
270
|
**Kịch bản B — Tất cả đã Confirmed:**
|
|
277
271
|
1. Chốt tài liệu phân tích (phiên bản cuối cùng là đầu vào Gate 3)
|
package/docs/common/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,53 @@ Versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
7
7
|
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
+
## [0.1.4] - 2026-06-29
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **`spec` task type — 4-Gate BA Workflow (Create Spec)** — New end-to-end spec creation workflow for Business Analysts. Activated when `taskType: "spec"` in context. Orchestrated by the `create-spec` skill across 4 gates:
|
|
15
|
+
- **Gate 1 — Phân tích Yêu cầu Ban đầu**: AI reads ticket, classifies Facts vs Assumptions, identifies Gaps, generates a Q&A list for clarification. BA reviews → `APPROVED`.
|
|
16
|
+
- **Gate 2 — Q&A Loop & Confirm**: AI iterates through each Q&A answer, updates analysis until all items are Confirmed. BA approves full Q&A → `APPROVED`.
|
|
17
|
+
- **Gate 3 — Prototype Design**: AI generates HTML/CSS prototype for the main screens. BA reviews UI flow → `APPROVED`.
|
|
18
|
+
- **Gate 4 — UC Spec hoàn chỉnh**: AI produces a complete UC Spec document (flows, business rules, validations, edge cases). BA reviews → `APPROVED`.
|
|
19
|
+
|
|
20
|
+
- **`testcase` task type — 4-Gate QA Workflow (Create Testcase)** — New structured test case creation workflow for QA engineers. Activated when `taskType: "testcase"` in context. Orchestrated by the `create-testcase` skill across 4 gates:
|
|
21
|
+
- **Gate 1 — Phân tích Yêu cầu & Rủi ro**: AI reads ticket/spec, analyzes scope and risk, reads source code to discover hidden validation rules and business logic. QA reviews → `APPROVED`.
|
|
22
|
+
- **Gate 2 — Xây dựng Scenarios & Checklist**: AI generates checklist grouped by Functional, Non-functional, Data & Integration, Regression. Checks Dev Artifacts (PR diff) via `pr-impact-analysis` skill to add regression TCs. Output: `test-plan/checklist.md`. QA reviews → `APPROVED`.
|
|
23
|
+
- **Gate 3 — Thiết kế Test Case chi tiết**: AI generates full TC table (TC_ID, Steps, Expected Result) using BVA, Equivalence Partitioning, Decision Table, State Transition techniques. Output: `test-plan/test-cases/`. QA reviews → `APPROVED`.
|
|
24
|
+
- **Gate 4 — Review & Tối ưu**: AI reviews coverage, removes duplicates, adds missing edge cases, exports final set to `test-plan/test-cases/final-testcases.md`. QA reviews → `APPROVED`.
|
|
25
|
+
|
|
26
|
+
- **BA Skills Library** (`custom/skills/ba-skills/`) — New collection of BA-specific sub-skills:
|
|
27
|
+
- `skill-ba-phan-tich-ban-dau-v1` — Initial requirement analysis (Facts vs Assumptions, Gap Analysis)
|
|
28
|
+
- `skill-ba-qa-v1` — Q&A generation and confirmation loop
|
|
29
|
+
- `skill-ba-viet-spec-uc-v1` — UC Spec writing with flows, business rules, validations
|
|
30
|
+
- `skill-ba-prototype-v1` — HTML/CSS prototype generation for UI screens
|
|
31
|
+
- `skill-ba-ve-luong-mermaid-v1` — Mermaid flow diagram generation
|
|
32
|
+
- `skill-ba-xay-dung-business-rules-v1` — Business rules extraction and structuring
|
|
33
|
+
|
|
34
|
+
- **Test Skills Library** (`custom/skills/test-skills/`) — New collection of 20+ QA sub-skills organized by category:
|
|
35
|
+
- **Core**: `requirement-analysis`, `risk-analysis`, `test-scenario-builder`, `testcase-review`
|
|
36
|
+
- **Test Design**: `boundary-value-analysis`, `equivalence-partitioning`, `decision-table`, `state-transition`, `pairwise`, `error-guessing`
|
|
37
|
+
- **UI Testing**: `UI-layout`, `form-validation`, `navigation`, `localization`, `accessibility`
|
|
38
|
+
- **Business Testing**: `CRUD-testing`, `workflow-testing`, `permission-testing`, `dependency-validation`, `notification-testing`, `calculation-testing`
|
|
39
|
+
- **Data Testing**: `database-testing`, `import-export-testing`, `data-mapping`, `duplicate-handling`, `migration`
|
|
40
|
+
- **Integration**: `API-testing`, `third-party-integration`, `batch-processing`, `file-upload-download`
|
|
41
|
+
- **Domain Skills**: `CMS`, `Ecommerce`
|
|
42
|
+
- **Review**: `coverage-review`, `knowledge-learning`, `repository-update`, `change-history`
|
|
43
|
+
|
|
44
|
+
- **`gate-review` skill** (`custom/skills/gate-review/SKILL.md`) — New gate review orchestration skill that enforces explicit `APPROVED` at each gate boundary across all workflow types (coding, execute, spec, testcase). Prevents silent gate advancement without QA/BA/DEV sign-off.
|
|
45
|
+
|
|
46
|
+
- **Gate review protocol in Execute Test Flow** — Gates 1, 3, and 4 of the execute-flow now explicitly require QA `APPROVED` before advancing. Gate 2 (Script Sync) is AI-only and advances automatically after sync completes.
|
|
47
|
+
|
|
48
|
+
- **`spec` and `testcase` options in `ak use` type selector** — Both the `promptForTaskType()` shared function and the `manualContext()` flow now include `spec` and `testcase` as selectable types, routing AI to the correct 4-gate workflow.
|
|
49
|
+
|
|
50
|
+
### Changed
|
|
51
|
+
|
|
52
|
+
- **`aiflow` CLI alias fully deprecated → use `ak`** — All documentation, README, QUICK_START, cli-reference, and guide output updated to use `ak` as the primary command. The `aiflow` command still works but shows a deprecation warning on every invocation.
|
|
53
|
+
- **README restructured** — "Overview Flow" section renamed to "Coding Flow"; Execute Test Flow merged into a single diagram (removed duplicate Vietnamese section); Create Spec Flow and Create Testcase Flow diagrams added.
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
10
57
|
## [0.1.3] - 2026-06-18
|
|
11
58
|
|
|
12
59
|
### Added
|
package/package.json
CHANGED
package/scripts/review.js
CHANGED
|
@@ -9,6 +9,10 @@ function reviewFilePath(gate, ticketId) {
|
|
|
9
9
|
return path.join(process.cwd(), REVIEW_DIR, `gate-${gate}-${ticketId}.md`);
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
+
function commentsFilePath(ticketId) {
|
|
13
|
+
return path.join(process.cwd(), REVIEW_DIR, `comments-${ticketId}.json`);
|
|
14
|
+
}
|
|
15
|
+
|
|
12
16
|
/**
|
|
13
17
|
* Parse a gate review file and return checkbox state.
|
|
14
18
|
*
|
|
@@ -17,65 +21,98 @@ function reviewFilePath(gate, ticketId) {
|
|
|
17
21
|
* @returns {Promise<{exists: boolean, passed?: boolean, total?: number, unchecked?: string[], commented?: Array<{item: string, comment: string}>}>}
|
|
18
22
|
*/
|
|
19
23
|
async function checkReviewFile(gate, ticketId) {
|
|
20
|
-
const
|
|
24
|
+
const mdPath = reviewFilePath(gate, ticketId);
|
|
25
|
+
const jsonPath = commentsFilePath(ticketId);
|
|
26
|
+
|
|
27
|
+
const mdExists = await fs.pathExists(mdPath);
|
|
28
|
+
const jsonExists = await fs.pathExists(jsonPath);
|
|
21
29
|
|
|
22
|
-
if (!
|
|
30
|
+
if (!mdExists && !jsonExists) {
|
|
23
31
|
return { exists: false };
|
|
24
32
|
}
|
|
25
33
|
|
|
26
|
-
const content = await fs.readFile(filePath, 'utf-8');
|
|
27
|
-
const lines = content.split('\n');
|
|
28
|
-
|
|
29
34
|
const unchecked = [];
|
|
30
35
|
const commented = [];
|
|
31
36
|
let total = 0;
|
|
32
37
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
38
|
+
// 1. Process JSON comments if file exists
|
|
39
|
+
if (jsonExists) {
|
|
40
|
+
try {
|
|
41
|
+
const data = await fs.readJson(jsonPath);
|
|
42
|
+
const comments = Array.isArray(data) ? data : (data.comments || []);
|
|
43
|
+
|
|
44
|
+
// Filter comments by gate
|
|
45
|
+
const gateComments = comments.filter(c => String(c.gate) === String(gate));
|
|
46
|
+
total += gateComments.length;
|
|
47
|
+
|
|
48
|
+
for (const comment of gateComments) {
|
|
49
|
+
const isUnresolved = comment.status === 'active' || comment.status === 'unresolved';
|
|
50
|
+
if (isUnresolved) {
|
|
51
|
+
const fileLabel = comment.filePath ? path.basename(comment.filePath) : 'File';
|
|
52
|
+
const itemLabel = `**[${fileLabel}:${comment.line || 1}]**`;
|
|
53
|
+
commented.push({
|
|
54
|
+
item: itemLabel,
|
|
55
|
+
comment: comment.text
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
} catch (err) {
|
|
60
|
+
console.error(`Error reading comments JSON: ${err.message}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// 2. Process MD checklist if file exists
|
|
65
|
+
if (mdExists) {
|
|
66
|
+
const content = await fs.readFile(mdPath, 'utf-8');
|
|
67
|
+
const lines = content.split('\n');
|
|
68
|
+
|
|
69
|
+
for (let i = 0; i < lines.length; i++) {
|
|
70
|
+
const line = lines[i];
|
|
71
|
+
const checkboxMatch = line.match(/^- \[([ xX])\] (.+)/);
|
|
72
|
+
if (!checkboxMatch) continue;
|
|
73
|
+
|
|
74
|
+
total++;
|
|
75
|
+
const isChecked = checkboxMatch[1].toLowerCase() === 'x';
|
|
76
|
+
const itemText = checkboxMatch[2].trim();
|
|
77
|
+
|
|
78
|
+
if (!isChecked) {
|
|
79
|
+
let comment = null;
|
|
80
|
+
let commentBuffer = '';
|
|
81
|
+
let inComment = false;
|
|
82
|
+
for (let j = i + 1; j < lines.length; j++) {
|
|
83
|
+
const nextLine = lines[j].trim();
|
|
84
|
+
if (!inComment && nextLine.match(/^- \[/)) break;
|
|
85
|
+
if (!inComment && nextLine === '---') break;
|
|
86
|
+
if (!inComment) {
|
|
87
|
+
const singleLineMatch = nextLine.match(/<!--([\s\S]+?)-->/);
|
|
88
|
+
if (singleLineMatch) {
|
|
89
|
+
comment = singleLineMatch[1].trim();
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
if (nextLine.includes('<!--')) {
|
|
93
|
+
inComment = true;
|
|
94
|
+
commentBuffer = nextLine.replace(/^.*<!--/, '');
|
|
95
|
+
if (commentBuffer.includes('-->')) {
|
|
96
|
+
comment = commentBuffer.replace(/-->.*$/, '').trim();
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
} else {
|
|
102
|
+
if (nextLine.includes('-->')) {
|
|
103
|
+
commentBuffer += ' ' + nextLine.replace(/-->.*$/, '');
|
|
104
|
+
comment = commentBuffer.trim();
|
|
61
105
|
break;
|
|
62
106
|
}
|
|
63
|
-
|
|
107
|
+
commentBuffer += ' ' + nextLine;
|
|
64
108
|
}
|
|
109
|
+
}
|
|
110
|
+
if (comment) {
|
|
111
|
+
commented.push({ item: itemText, comment });
|
|
65
112
|
} else {
|
|
66
|
-
|
|
67
|
-
commentBuffer += ' ' + nextLine.replace(/-->.*$/, '');
|
|
68
|
-
comment = commentBuffer.trim();
|
|
69
|
-
break;
|
|
70
|
-
}
|
|
71
|
-
commentBuffer += ' ' + nextLine;
|
|
113
|
+
unchecked.push(itemText);
|
|
72
114
|
}
|
|
73
115
|
}
|
|
74
|
-
if (comment) {
|
|
75
|
-
commented.push({ item: itemText, comment });
|
|
76
|
-
} else {
|
|
77
|
-
unchecked.push(itemText);
|
|
78
|
-
}
|
|
79
116
|
}
|
|
80
117
|
}
|
|
81
118
|
|
|
@@ -88,4 +125,4 @@ async function checkReviewFile(gate, ticketId) {
|
|
|
88
125
|
};
|
|
89
126
|
}
|
|
90
127
|
|
|
91
|
-
module.exports = { checkReviewFile, reviewFilePath };
|
|
128
|
+
module.exports = { checkReviewFile, reviewFilePath, commentsFilePath };
|