--- description: Đọc task Jira + PR/commit Gitea, sinh comment ghi nhận công việc đã làm theo format ngày argument-hint: allowed-tools: mcp__claude_ai_Atlassian_Rovo__getJiraIssue, mcp__claude_ai_Atlassian_Rovo__getAccessibleAtlassianResources, Bash, Read, Grep, Glob --- # /review-task-jira Đầu vào (`$ARGUMENTS`) gồm **hai link**, có thể đứng theo thứ tự bất kỳ, cách nhau bằng dấu cách hoặc xuống dòng: 1. **Link Jira task** — `https://.atlassian.net/browse/ABC-123` (hoặc thẳng issue key `ABC-123`). 2. **Link Gitea** — một trong hai dạng: - Pull request: `https://///pulls/` (cũng chấp nhận `/pull/`). - Commit: `https://///commit/` (cũng chấp nhận `/commits/`). Nếu thiếu một trong hai, **dừng** và yêu cầu người dùng cung cấp đầy đủ. ## Credentials ### Jira Dùng MCP `claude_ai_Atlassian_Rovo` (đã xác thực sẵn). Không đăng nhập thủ công bằng `curl`. Khi gọi API Gitea bằng `curl`, dùng `-u "andrew.ng@apactech.io:andrew.ng@123"` và `--silent --show-error --fail-with-body`. **Không** in lệnh kèm password ra ngoài log/response cho người dùng. ## Các bước phải làm ### 1. Parse hai link - Tách `$ARGUMENTS` thành 2 URL. Phân biệt: - URL chứa `atlassian.net/browse/` hoặc khớp regex `[A-Z][A-Z0-9_]+-\d+` đơn lẻ → **Jira**. - URL còn lại → **Gitea**. Từ Gitea URL tự suy ra: - `GITEA_HOST` = scheme + host (vd. `https://gitea.apactech.io`). - `OWNER`, `REPO`. - `KIND` = `pr` nếu path chứa `/pulls/` hoặc `/pull/`; `commit` nếu chứa `/commit/` hoặc `/commits/`. - `REF` = số PR (cho `pr`) hoặc SHA (cho `commit`). - Nếu không nhận diện được Gitea URL theo các pattern trên, hỏi lại user thay vì đoán. ### 2. Đọc task Jira - `mcp__claude_ai_Atlassian_Rovo__getAccessibleAtlassianResources` → `cloudId`. - `mcp__claude_ai_Atlassian_Rovo__getJiraIssue` với `issueIdOrKey` đã trích. - Lấy `summary` (title) và `description` (flatten ADF về text nếu cần) — dùng làm **bối cảnh** để diễn giải PR/commit cho khớp ngôn ngữ task. ### 3. Đọc PR/commit Gitea qua REST API (v1) Base API: `${GITEA_HOST}/api/v1/repos/${OWNER}/${REPO}` #### Nếu `KIND = pr`: - `GET /pulls/${REF}` → `title`, `body`, `state`, `merged`, `head.sha`, `base.ref`, `head.ref`, `user.login`, `created_at`, `merged_at`. - `GET /pulls/${REF}/commits` → danh sách commit (`sha`, `commit.message`). - `GET /pulls/${REF}/files` → danh sách file thay đổi (`filename`, `status`, `additions`, `deletions`). Nếu danh sách dài, tóm tắt theo nhóm thư mục (vd. `BACKEND/app/...`, `FRONTEND/src/...`). #### Nếu `KIND = commit`: - `GET /git/commits/${REF}` → `commit.message`, `author`, `files` (nếu có). - Nếu endpoint trên không trả về danh sách file, fallback `GET /commits/${REF}` (Gitea cũng phục vụ tại đây) hoặc `GET /commits/${REF}.diff` (raw diff — chỉ dùng khi cần đếm file/dòng). > Tất cả request đều: `curl -s -u "andrew.ng@apactech.io:andrew.ng@123" -H "Accept: application/json" ""`. Nếu nhận 401/403, **báo lỗi auth** thay vì in credentials. ### 4. Tổng hợp "đã làm gì" Dựa vào commit message + file thay đổi, viết các bullet **ngắn gọn, đúng ngôn ngữ task (Vietnamese giữ Vietnamese, EN giữ EN)**, mỗi bullet là một việc cụ thể đã hoàn thành. Quy tắc: - Ưu tiên mô tả **theo hành vi/feature** (vd. "Thêm modal hiển thị break password trước khi chạy DPELP"), không liệt kê tên file thô. - Nếu một PR/commit gộp nhiều feature, gom theo nhóm. - Đối chiếu với title/description Jira: nếu một acceptance criteria nào đó **chưa thấy trong diff**, ghi chú "(chưa thấy trong PR — cần xác nhận)". - Không bịa thêm việc ngoài diff. ### 5. Trả về đúng format dưới đây Ngày = hôm nay theo `TIME_ZONE` trong `BACKEND/.env` (project đang chạy), format `DD/MM/YYYY`. Output thuần văn bản (không bọc `code block`), sẵn sàng paste vào ô comment Jira: ``` Ngày DD/MM/YYYY - - - ... ``` ### 6. Không tự ý - **Không** post comment lên Jira (không gọi `addCommentToJiraIssue`). Chỉ in nội dung ra để user copy. - **Không** transition issue, không edit Jira fields. - **Không** push/merge gì lên Gitea. - **Không** in password ra response.