@torus-engineering/tas-kit 1.5.1 → 1.7.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.
- package/.claude/agents/README.md +83 -0
- package/.claude/agents/architect.md +53 -0
- package/.claude/agents/aws-reviewer.md +71 -0
- package/.claude/agents/build-resolver.md +59 -0
- package/.claude/agents/code-architect.md +62 -0
- package/.claude/agents/code-explorer.md +63 -0
- package/.claude/agents/code-simplifier.md +53 -0
- package/.claude/agents/comment-analyzer.md +59 -0
- package/.claude/agents/conversation-analyzer.md +57 -0
- package/.claude/agents/csharp-reviewer.md +62 -0
- package/.claude/agents/database-reviewer.md +73 -0
- package/.claude/agents/doc-updater.md +66 -0
- package/.claude/agents/docs-lookup.md +55 -0
- package/.claude/agents/e2e-runner.md +61 -0
- package/.claude/agents/harness-optimizer.md +62 -0
- package/.claude/agents/loop-operator.md +56 -0
- package/.claude/agents/performance-optimizer.md +78 -0
- package/.claude/agents/planner.md +82 -0
- package/.claude/agents/pr-test-analyzer.md +68 -0
- package/.claude/agents/python-reviewer.md +67 -0
- package/.claude/agents/pytorch-build-resolver.md +76 -0
- package/.claude/agents/refactor-cleaner.md +70 -0
- package/.claude/agents/security-reviewer.md +79 -0
- package/.claude/agents/seo-specialist.md +75 -0
- package/.claude/agents/silent-failure-hunter.md +69 -0
- package/.claude/agents/tdd-guide.md +84 -0
- package/.claude/agents/type-design-analyzer.md +75 -0
- package/.claude/agents/typescript-reviewer.md +65 -0
- package/.claude/commands/ado-create.md +2 -1
- package/.claude/commands/ado-delete.md +3 -2
- package/.claude/commands/ado-get.md +2 -1
- package/.claude/commands/ado-status.md +2 -1
- package/.claude/commands/ado-update.md +2 -1
- package/.claude/commands/tas-adr.md +13 -12
- package/.claude/commands/tas-bug.md +97 -50
- package/.claude/commands/tas-design.md +3 -1
- package/.claude/commands/tas-dev.md +115 -0
- package/.claude/commands/tas-epic.md +4 -2
- package/.claude/commands/tas-feature.md +5 -3
- package/.claude/commands/tas-fix.md +47 -0
- package/.claude/commands/tas-plan.md +184 -0
- package/.claude/commands/tas-prd.md +3 -1
- package/.claude/commands/tas-review.md +104 -0
- package/.claude/commands/tas-sad.md +3 -1
- package/.claude/commands/tas-security.md +80 -0
- package/.claude/commands/tas-spec.md +50 -0
- package/.claude/commands/tas-story.md +77 -40
- package/.claude/commands/tas-verify.md +8 -0
- package/.claude/hooks/code-quality.js +127 -0
- package/.claude/hooks/session-end.js +116 -0
- package/.claude/rules/.gitkeep +0 -0
- package/.claude/rules/common/agents.md +65 -0
- package/.claude/rules/common/code-review.md +124 -0
- package/.claude/rules/common/coding-style.md +90 -0
- package/.claude/rules/common/development-workflow.md +44 -0
- package/.claude/rules/common/git-workflow.md +24 -0
- package/.claude/rules/common/hooks.md +30 -0
- package/.claude/rules/common/patterns.md +31 -0
- package/.claude/rules/common/performance.md +55 -0
- package/.claude/rules/common/post-review-agent.md +39 -0
- package/.claude/rules/common/project-status.md +80 -0
- package/.claude/rules/common/security.md +29 -0
- package/.claude/rules/common/stack-detection.md +29 -0
- package/.claude/rules/common/testing.md +57 -0
- package/.claude/rules/csharp/coding-style.md +72 -0
- package/.claude/rules/csharp/hooks.md +25 -0
- package/.claude/rules/csharp/patterns.md +50 -0
- package/.claude/rules/csharp/security.md +58 -0
- package/.claude/rules/csharp/testing.md +46 -0
- package/.claude/rules/python/coding-style.md +42 -0
- package/.claude/rules/python/hooks.md +19 -0
- package/.claude/rules/python/patterns.md +39 -0
- package/.claude/rules/python/security.md +30 -0
- package/.claude/rules/python/testing.md +38 -0
- package/.claude/rules/typescript/coding-style.md +199 -0
- package/.claude/rules/typescript/hooks.md +22 -0
- package/.claude/rules/typescript/patterns.md +52 -0
- package/.claude/rules/typescript/security.md +28 -0
- package/.claude/rules/typescript/testing.md +18 -0
- package/.claude/rules/web/coding-style.md +96 -0
- package/.claude/rules/web/design-quality.md +63 -0
- package/.claude/rules/web/hooks.md +120 -0
- package/.claude/rules/web/patterns.md +79 -0
- package/.claude/rules/web/performance.md +64 -0
- package/.claude/rules/web/security.md +57 -0
- package/.claude/rules/web/testing.md +55 -0
- package/.claude/settings.json +37 -0
- package/.claude/settings.local.json +38 -0
- package/.claude/skills/ado-integration/SKILL.md +44 -1
- package/.claude/skills/agent-harness-construction/SKILL.md +77 -0
- package/.claude/skills/agent-introspection-debugging/SKILL.md +157 -0
- package/.claude/skills/ai-regression-testing/SKILL.md +364 -0
- package/.claude/skills/api-design/SKILL.md +528 -0
- package/.claude/skills/architecture-decision-records/SKILL.md +184 -0
- package/.claude/skills/backend-patterns/SKILL.md +602 -0
- package/.claude/skills/benchmark/SKILL.md +98 -0
- package/.claude/skills/browser-qa/SKILL.md +92 -0
- package/.claude/skills/canary-watch/SKILL.md +104 -0
- package/.claude/skills/tas-conventions/SKILL.md +51 -3
- package/.claude/skills/tas-implementation-complete/SKILL.md +97 -0
- package/.claude/skills/tas-tdd/SKILL.md +72 -16
- package/.tas/README.md +29 -24
- package/.tas/tas-example.yaml +2 -1
- package/.tas/templates/SAD.md +221 -11
- package/.tas/templates/Story.md +18 -18
- package/CLAUDE-Example.md +1 -1
- package/README.md +20 -5
- package/bin/cli.js +13 -6
- package/lib/install.js +68 -6
- package/package.json +2 -2
- package/.claude/commands/tas-dev-story.md +0 -61
- package/.claude/commands/tas-review-code.md +0 -42
- package/.claude/commands/tas-security-check.md +0 -30
|
@@ -1,24 +1,25 @@
|
|
|
1
|
-
|
|
1
|
+
# /tas-adr $ARGUMENTS
|
|
2
2
|
|
|
3
3
|
Vai trò: SE - Software Engineer
|
|
4
4
|
Tạo mới hoặc cập nhật Architecture Decision Record.
|
|
5
5
|
|
|
6
6
|
## Hành động
|
|
7
|
-
1. Cần context từ
|
|
8
|
-
2.
|
|
9
|
-
3.
|
|
10
|
-
4. Xác định chế độ dựa vào $ARGUMENTS:
|
|
7
|
+
1. Cần context từ .tas/templates/ADR.md
|
|
8
|
+
2. Quét docs/adr/ để xác định các ADR hiện có
|
|
9
|
+
3. Xác định chế độ dựa vào $ARGUMENTS:
|
|
11
10
|
|
|
12
11
|
### Chế độ CREATE ($ARGUMENTS là tiêu đề mới, ví dụ: "Use CQRS for Order Service"):
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
4. Xác định số thứ tự tiếp theo (ADR-001, ADR-002...)
|
|
13
|
+
5. Nếu docs/sad.md tồn tại, cần context từ SAD để đảm bảo ADR consistent
|
|
14
|
+
6. Tạo file docs/adr/ADR-{NNN}-{slug}.md
|
|
15
|
+
7. Cập nhật `project-status.yaml` theo `.claude/rules/common/project-status.md` — thêm entry vào `adrs`.
|
|
16
16
|
|
|
17
17
|
### Chế độ UPDATE ($ARGUMENTS là ADR ID, ví dụ: "ADR-001"):
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
4. Cần context từ file ADR hiện tại
|
|
19
|
+
5. Hỏi user cần thay đổi gì (cập nhật status, thêm consequences, supersede...)
|
|
20
|
+
6. Cập nhật file, thêm changelog
|
|
21
|
+
7. Nếu supersede: cập nhật status ADR cũ thành "Superseded by ADR-{NNN}"
|
|
22
|
+
8. Cập nhật `project-status.yaml` theo `.claude/rules/common/project-status.md` — cập nhật `adrs.{ADR_ID}.status`.
|
|
22
23
|
|
|
23
24
|
## Nguyên tắc
|
|
24
25
|
- ADR phải có: Context, Decision, Rationale, Consequences, Alternatives Considered
|
|
@@ -1,62 +1,109 @@
|
|
|
1
|
-
|
|
1
|
+
# /tas-bug $ARGUMENTS
|
|
2
2
|
|
|
3
3
|
Quản lý toàn bộ lifecycle của bug: tạo, phân tích, fix, verify.
|
|
4
|
-
|
|
4
|
+
Status của bug xác định bước tiếp theo — không cần khai báo role.
|
|
5
|
+
|
|
6
|
+
## Always / Ask / Never
|
|
7
|
+
|
|
8
|
+
| | Hành động |
|
|
9
|
+
|---|---|
|
|
10
|
+
| **Always** | Hiển thị status hiện tại và action tiếp theo trước khi làm gì |
|
|
11
|
+
| **Always** | Viết regression test TRƯỚC khi fix |
|
|
12
|
+
| **Always** | Launch review agent độc lập sau khi fix — không review trong cùng session |
|
|
13
|
+
| **Ask** | Khi cần đọc thêm file ngoài Bug file (Status = Committed) |
|
|
14
|
+
| **Never** | Patch symptom — phải fix root cause |
|
|
15
|
+
| **Never** | Bỏ qua bước review sau khi fix |
|
|
16
|
+
| **Never** | Tự commit hay push — đợi user test thủ công trước |
|
|
17
|
+
|
|
18
|
+
## Stack Detection
|
|
19
|
+
Đọc `.claude/rules/common/stack-detection.md`.
|
|
5
20
|
|
|
6
21
|
## Hành động
|
|
7
|
-
1. Cần context từ root/tas.yaml
|
|
8
|
-
2. Cần context từ .tas/templates/Bug.md
|
|
9
|
-
3. Xác định chế độ dựa vào $ARGUMENTS:
|
|
10
22
|
|
|
11
|
-
###
|
|
23
|
+
### Bước 1 — Xác định chế độ
|
|
24
|
+
|
|
25
|
+
`$ARGUMENTS` là mô tả bug mới → **Chế độ CREATE**
|
|
26
|
+
`$ARGUMENTS` là Bug ID (ví dụ: `Bug-001`) → **Chế độ UPDATE**
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
### Chế độ CREATE
|
|
31
|
+
|
|
12
32
|
Vai trò: PE hoặc SE (ai phát hiện bug)
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
33
|
+
|
|
34
|
+
1. Đọc `project.code` từ root/`tas.yaml`
|
|
35
|
+
2. Hỏi user:
|
|
36
|
+
- Bug thuộc Feature nào?
|
|
37
|
+
- Severity: `Critical` | `High` | `Medium` | `Low`
|
|
16
38
|
- Steps to reproduce
|
|
17
39
|
- Expected vs Actual behavior
|
|
18
|
-
- Môi trường phát hiện
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
### Chế độ UPDATE
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
4.
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
40
|
+
- Môi trường phát hiện: Test | Staging | Production
|
|
41
|
+
3. Tạo `docs/bugs/{code}-Bug-{NNN}-{slug}.md` từ template `.tas/templates/Bug.md`
|
|
42
|
+
4. Bug status ban đầu: `New`
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
### Chế độ UPDATE
|
|
47
|
+
|
|
48
|
+
Tìm file Bug qua glob `docs/bugs/*-Bug-{ID}-*.md`, đọc status hiện tại.
|
|
49
|
+
|
|
50
|
+
**Hiển thị trước khi làm gì:**
|
|
51
|
+
> "Bug-{NNN} đang ở status: **{status}** — bước tiếp theo là {action}. Tiếp tục không?"
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
#### Status = `New` — Phân tích (SE)
|
|
56
|
+
|
|
57
|
+
1. Đọc error logs/stack trace từ Bug file
|
|
58
|
+
2. Trace code flow, xác định file và dòng gây lỗi
|
|
59
|
+
3. Ghi Root Cause Analysis vào Bug file
|
|
60
|
+
4. Viết Regression Test Cases (test reproduce bug)
|
|
61
|
+
5. Cập nhật status: `New` → `Committed`
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
#### Status = `Committed` — Fix (SE)
|
|
66
|
+
|
|
67
|
+
**Quy tắc đọc file:** CHỈ đọc Bug file. KHÔNG đọc PRD, SAD, ADR, Design-Spec, KHÔNG quét thư mục.
|
|
68
|
+
Nếu cần thêm file → hỏi user xác nhận trước.
|
|
69
|
+
|
|
70
|
+
Trước khi fix, đọc:
|
|
71
|
+
- `.claude/rules/common/security.md` — fix không tạo security risk mới
|
|
72
|
+
- `.claude/rules/common/testing.md` — pattern viết regression test
|
|
73
|
+
- `.claude/rules/[lang_agent stack]/coding-style.md` — tuân thủ conventions
|
|
74
|
+
|
|
75
|
+
**Fix workflow:**
|
|
76
|
+
a. Chạy regression test case → xác nhận **FAIL** (reproduce bug)
|
|
77
|
+
b. Fix code đúng root cause
|
|
78
|
+
c. Chạy regression test → xác nhận **PASS**
|
|
79
|
+
d. Chạy toàn bộ test suite → không có regression mới
|
|
80
|
+
→ Nếu build fail hoặc test lỗi compile: launch `build-resolver` agent với error output trước khi tiếp tục.
|
|
81
|
+
|
|
82
|
+
**Sau khi fix — Post-Fix Review (Isolated Agent):**
|
|
83
|
+
|
|
84
|
+
Thực hiện theo `.claude/rules/common/post-review-agent.md`.
|
|
85
|
+
Truyền vào: Bug file path, danh sách changed files, stack (từ CLAUDE.md), lang_agent.
|
|
86
|
+
|
|
87
|
+
Sau khi review pass:
|
|
88
|
+
- Cập nhật status: `Committed` → `Deploy Test`
|
|
89
|
+
- Output commit message gợi ý: `fix: {mô tả ngắn} - resolves Bug-{NNN}`
|
|
90
|
+
- Hỏi: "Bạn đã test thủ công chưa? Muốn commit và deploy lên Test không?"
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
#### Status = `Verify Test` / `Verify Stag` — Verify (PE)
|
|
95
|
+
|
|
96
|
+
1. PE verify trên môi trường tương ứng:
|
|
97
|
+
- Chạy lại Steps to Reproduce → xác nhận bug không còn
|
|
53
98
|
- Kiểm tra regression test case đã pass
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
99
|
+
2. **Pass** → cập nhật status tiếp theo (`Deploy Stag` hoặc `Done`)
|
|
100
|
+
3. **Fail** → ghi lý do, cập nhật status về `Committed`, SE fix lại
|
|
101
|
+
|
|
102
|
+
---
|
|
57
103
|
|
|
58
104
|
## Nguyên tắc
|
|
59
|
-
- KHÔNG patch symptom
|
|
105
|
+
- KHÔNG patch symptom — phải fix root cause
|
|
60
106
|
- PHẢI có regression test case TRƯỚC khi fix
|
|
61
|
-
-
|
|
62
|
-
- Bug Critical
|
|
107
|
+
- Review phải chạy qua Agent độc lập — không inline trong session hiện tại
|
|
108
|
+
- Bug `Critical`/`High` phải fix trước khi Feature được Verified
|
|
109
|
+
- Flow: `New` → `Committed` → `Deploy Test` → `Verify Test` → `Deploy Stag` → `Verify Stag` → `Deploy Prod` → `Verify Prod` → `Done`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
# /tas-design $ARGUMENTS
|
|
2
2
|
|
|
3
3
|
Vai trò: PE - Product Engineer
|
|
4
4
|
Tạo hoặc cập nhật Design Specification document (UI/UX flows, wireframe descriptions).
|
|
@@ -19,11 +19,13 @@ Tạo hoặc cập nhật Design Specification document (UI/UX flows, wireframe
|
|
|
19
19
|
- Navigation structure
|
|
20
20
|
- Interaction patterns
|
|
21
21
|
- Responsive behavior notes
|
|
22
|
+
6. Cập nhật `project-status.yaml` theo `.claude/rules/common/project-status.md` — thêm `artifacts.design_spec`.
|
|
22
23
|
|
|
23
24
|
### Chế độ UPDATE (file đã tồn tại):
|
|
24
25
|
3. Cần context từ docs/design-spec.md hiện tại
|
|
25
26
|
4. $ARGUMENTS là mô tả thay đổi. Nếu không có, hỏi user cần cập nhật section nào.
|
|
26
27
|
5. Cập nhật file, thêm changelog
|
|
28
|
+
6. Cập nhật `project-status.yaml` theo `.claude/rules/common/project-status.md` — cập nhật `artifacts.design_spec`.
|
|
27
29
|
|
|
28
30
|
## Nguyên tắc
|
|
29
31
|
- Focus vào flows và behavior, không vào pixel-perfect design
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# /tas-dev $ARGUMENTS
|
|
2
|
+
|
|
3
|
+
Vai trò: SE - Software Engineer
|
|
4
|
+
Implement một User Story theo Technical Plan đã được duyệt.
|
|
5
|
+
|
|
6
|
+
## Always / Ask / Never
|
|
7
|
+
|
|
8
|
+
| | Hành động |
|
|
9
|
+
|---|---|
|
|
10
|
+
| **Always** | Kiểm tra `plan_status` trước khi implement |
|
|
11
|
+
| **Always** | Follow tasks trong `## Technical Plan` của Story |
|
|
12
|
+
| **Always** | Launch review agent độc lập sau khi implement — không review trong cùng session |
|
|
13
|
+
| **Ask** | Khi phát hiện plan cần thay đổi đáng kể trong lúc code |
|
|
14
|
+
| **Ask** | Khi cần đọc thêm file ngoài scope của plan |
|
|
15
|
+
| **Never** | Implement ngoài scope Story |
|
|
16
|
+
| **Never** | Skip bước review sau khi implement |
|
|
17
|
+
|
|
18
|
+
## QUAN TRỌNG - Quy tắc đọc file
|
|
19
|
+
- CHỈ đọc Story file — Technical Plan đã có đủ context kỹ thuật.
|
|
20
|
+
- Không tự đọc PRD, SAD, ADR, Design-Spec trừ khi user xác nhận.
|
|
21
|
+
- Không list thư mục, không quét project structure.
|
|
22
|
+
- Không đọc `.tas/checklists/story-done.md` ở bước đầu (chỉ đọc ở bước cuối).
|
|
23
|
+
|
|
24
|
+
## Stack Detection
|
|
25
|
+
Đọc `.claude/rules/common/stack-detection.md`.
|
|
26
|
+
|
|
27
|
+
## Hành động
|
|
28
|
+
|
|
29
|
+
### Bước 1 — Xác định Story
|
|
30
|
+
|
|
31
|
+
`$ARGUMENTS` là Story ID hoặc file path.
|
|
32
|
+
Nếu không có: đọc `project-status.yaml`, tìm stories có `status: Committed` hoặc `status: In Progress`. Nếu nhiều hơn một, liệt kê để user chọn.
|
|
33
|
+
Đọc Story file.
|
|
34
|
+
|
|
35
|
+
### Bước 1.5 — Gate: Kiểm tra plan_status
|
|
36
|
+
|
|
37
|
+
Đọc `plan_status` từ frontmatter của Story.
|
|
38
|
+
|
|
39
|
+
**Nếu `plan_status: pending`:**
|
|
40
|
+
Đọc `require_plan` từ root/`tas.yaml`:
|
|
41
|
+
- `require_plan: true` (hoặc field không tồn tại) → **DỪNG LẠI**:
|
|
42
|
+
> "Story này chưa có Technical Plan. Chạy `/tas-plan {Story-ID}` trước khi implement."
|
|
43
|
+
- `require_plan: false` → tiếp tục, hiển thị warning và chờ xác nhận:
|
|
44
|
+
> "⚠️ Quick mode: Story chưa có Technical Plan. Tiếp tục implement không?"
|
|
45
|
+
|
|
46
|
+
**Nếu `plan_status: completed`:** tiếp tục bình thường.
|
|
47
|
+
|
|
48
|
+
### Bước 2 — Đọc Technical Plan
|
|
49
|
+
|
|
50
|
+
Từ Story file, đọc section `## Technical Plan`:
|
|
51
|
+
- Approach đã chọn
|
|
52
|
+
- Files to Change / Files to Create
|
|
53
|
+
- Database Changes, Config Changes
|
|
54
|
+
- Tasks list (checklist thực hiện theo thứ tự)
|
|
55
|
+
|
|
56
|
+
Nếu không có Technical Plan (quick mode) → phân tích AC và implement trực tiếp theo AC.
|
|
57
|
+
|
|
58
|
+
### Bước 3 — Implement
|
|
59
|
+
|
|
60
|
+
#### Nếu `use_tdd = true` trong `tas.yaml`:
|
|
61
|
+
a. **Red phase** — Viết test cases TRƯỚC theo AC trong Story. Chạy tests, xác nhận FAIL.
|
|
62
|
+
b. **Green phase** — Viết code tối thiểu để pass tests.
|
|
63
|
+
c. **Refactor** — Clean up, đảm bảo tests vẫn pass.
|
|
64
|
+
|
|
65
|
+
#### Nếu `use_tdd = false`:
|
|
66
|
+
a. Implement code theo AC + Tasks trong Technical Plan
|
|
67
|
+
b. Viết unit tests cover các cases trong `## Unit Test Cases`
|
|
68
|
+
c. Chạy tests, fix nếu fail
|
|
69
|
+
→ Nếu tests vẫn fail sau 1 lần tự fix: launch `build-resolver` agent với error output để diagnose.
|
|
70
|
+
|
|
71
|
+
Trong quá trình implement, tick từng task hoàn thành trong Story file: `- [x] Task 1: ...`
|
|
72
|
+
|
|
73
|
+
Nếu phát hiện plan cần thay đổi đáng kể → thông báo user trước khi thay đổi hướng.
|
|
74
|
+
|
|
75
|
+
### Bước 4 — Post-Implementation Review (Isolated Agent)
|
|
76
|
+
|
|
77
|
+
Thực hiện theo `.claude/rules/common/post-review-agent.md`.
|
|
78
|
+
Truyền vào: Story file path, danh sách changed files, stack (từ CLAUDE.md), lang_agent.
|
|
79
|
+
|
|
80
|
+
### Bước 5 — Definition of Done
|
|
81
|
+
|
|
82
|
+
Đọc `.tas/checklists/story-done.md`, verify từng mục, tick vào Story:
|
|
83
|
+
- `- [x] Technical plan completed` — nếu plan_status: completed (hoặc quick mode xác nhận)
|
|
84
|
+
- `- [x] Code implemented` — nếu implement xong
|
|
85
|
+
- `- [x] Unit tests pass` — nếu tests đã pass
|
|
86
|
+
- `- [x] No regression` — nếu toàn bộ test suite pass
|
|
87
|
+
- `- [x] Documentation updated (if needed)` — nếu đã cập nhật
|
|
88
|
+
- `- [x] Code review passed` — nếu review gate pass (không có Critical/High)
|
|
89
|
+
- `- [ ] Acceptance criteria verified` — KHÔNG tick, để PE verify
|
|
90
|
+
|
|
91
|
+
**Optional — nếu Story thay đổi API public, database schema, hoặc setup:**
|
|
92
|
+
Launch `doc-updater` agent: cập nhật docs liên quan (README, SAD section, API docs).
|
|
93
|
+
> Scope: [danh sách changed files]. Story: [Story ID + title].
|
|
94
|
+
> Chỉ cập nhật phần docs đã lỗi thời — không viết lại từ đầu.
|
|
95
|
+
|
|
96
|
+
### Bước 6 — Wrap up
|
|
97
|
+
|
|
98
|
+
Cập nhật Story status → `In Progress` (nếu chưa).
|
|
99
|
+
Tạo commit message theo conventions trong `CLAUDE.md`.
|
|
100
|
+
Hỏi: "Tests OK và review passed rồi — bạn đã test thủ công chưa? Muốn chuyển sang Deploy Test không?"
|
|
101
|
+
|
|
102
|
+
Nếu Yes:
|
|
103
|
+
- Cập nhật Story status → `Deploy Test`
|
|
104
|
+
- Thêm Changelog entry
|
|
105
|
+
- Cập nhật `project-status.yaml`
|
|
106
|
+
- Gợi ý: `/ado-update story {ado-id} --status "Deploy Test"` nếu dùng ADO
|
|
107
|
+
|
|
108
|
+
## Nguyên tắc
|
|
109
|
+
- KHÔNG implement ngoài scope của Story
|
|
110
|
+
- Mỗi public method PHẢI có XML doc comment (C#) hoặc JSDoc (TypeScript) hoặc docstring (Python)
|
|
111
|
+
- Review phải chạy qua Agent độc lập — không inline trong session hiện tại
|
|
112
|
+
- **Khi nào cần tạo ADR** (nếu Technical Plan chưa đề cập):
|
|
113
|
+
- Thay đổi kiến trúc ảnh hưởng nhiều components
|
|
114
|
+
- Thêm mới design pattern hoặc framework
|
|
115
|
+
- Quyết định trade-off kỹ thuật quan trọng
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
# /tas-epic $ARGUMENTS
|
|
2
2
|
|
|
3
3
|
Vai trò: PE - Product Engineer
|
|
4
4
|
Tạo mới hoặc cập nhật Epic document.
|
|
@@ -13,15 +13,17 @@ Tạo mới hoặc cập nhật Epic document.
|
|
|
13
13
|
|
|
14
14
|
### Chế độ CREATE ($ARGUMENTS là mô tả Epic mới, hoặc không có $ARGUMENTS):
|
|
15
15
|
4. Nếu không có $ARGUMENTS, hỏi user mô tả Epic.
|
|
16
|
-
5. Đọc project.code từ root/tas.yaml
|
|
16
|
+
5. Đọc project.code từ root/tas.yaml. Quét docs/epics/ để xác định số thứ tự.
|
|
17
17
|
6. Tạo thư mục docs/epics/{code}-Epic-{NNN}-{slug}/
|
|
18
18
|
7. Tạo file docs/epics/{code}-Epic-{NNN}-{slug}/{code}-Epic-{NNN}-{slug}.md
|
|
19
|
+
8. Cập nhật `project-status.yaml` theo `.claude/rules/common/project-status.md` — thêm entry vào `epics`.
|
|
19
20
|
|
|
20
21
|
### Chế độ UPDATE ($ARGUMENTS là Epic ID, ví dụ: "Epic-001"):
|
|
21
22
|
4. Tìm thư mục docs/epics/{code}-Epic-001-*/
|
|
22
23
|
5. Cần context từ file Epic hiện tại
|
|
23
24
|
6. Hỏi user cần thay đổi gì (cập nhật scope, thêm feature, đổi status...)
|
|
24
25
|
7. Cập nhật file, thêm changelog
|
|
26
|
+
8. Cập nhật `project-status.yaml` theo `.claude/rules/common/project-status.md` — cập nhật `epics.{EPIC_ID}.status`.
|
|
25
27
|
|
|
26
28
|
## Nguyên tắc
|
|
27
29
|
- Mỗi Epic map với một business capability trong PRD
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
# /tas-feature $ARGUMENTS
|
|
2
2
|
|
|
3
3
|
Vai trò: PE - Product Engineer
|
|
4
4
|
Tạo mới hoặc cập nhật Feature document, bao gồm thiết kế Integration Test và E2E/Acceptance Test.
|
|
@@ -12,8 +12,8 @@ Tạo mới hoặc cập nhật Feature document, bao gồm thiết kế Integra
|
|
|
12
12
|
3. Xác định chế độ dựa vào $ARGUMENTS:
|
|
13
13
|
|
|
14
14
|
### Chế độ CREATE ($ARGUMENTS là mô tả Feature mới, hoặc không có $ARGUMENTS):
|
|
15
|
-
4. Đọc project.code từ root/tas.yaml
|
|
16
|
-
5. Quét thư mục Epic đã chọn để xác định số thứ tự Feature
|
|
15
|
+
4. Đọc project.code từ root/tas.yaml. Liệt kê các Epic hiện có, hỏi user Feature này thuộc Epic nào.
|
|
16
|
+
5. Quét thư mục Epic đã chọn để xác định số thứ tự Feature.
|
|
17
17
|
6. Tạo thư mục docs/epics/{code}-Epic-{NNN}-{slug}/{code}-Feature-{NNN}-{slug}/
|
|
18
18
|
7. Tạo file {code}-Feature-{NNN}-{slug}.md trong thư mục đó
|
|
19
19
|
8. Sau khi PE điền mô tả và acceptance criteria, TỰ ĐỘNG chuyển sang thiết kế test:
|
|
@@ -27,12 +27,14 @@ Tạo mới hoặc cập nhật Feature document, bao gồm thiết kế Integra
|
|
|
27
27
|
- "Có scenario nào cần test với data thật hoặc gần thật?"
|
|
28
28
|
- "Acceptance criteria nào cần PE verify thủ công?"
|
|
29
29
|
Ghi vào section E2E Test Cases. Đây là checklist PE dùng ở Phase 2 khi chạy /tas-verify.
|
|
30
|
+
9. Cập nhật `project-status.yaml` theo `.claude/rules/common/project-status.md` — thêm entry vào `epics.{EPIC_ID}.features`.
|
|
30
31
|
|
|
31
32
|
### Chế độ UPDATE ($ARGUMENTS là Feature ID, ví dụ: "Feature-003"):
|
|
32
33
|
4. Tìm file Feature trong cây docs/epics/ (dùng glob)
|
|
33
34
|
5. Cần context từ file Feature hiện tại
|
|
34
35
|
6. Hỏi user cần thay đổi gì (thêm story, cập nhật AC, thêm test cases, đổi status...)
|
|
35
36
|
7. Cập nhật file, thêm changelog
|
|
37
|
+
8. Cập nhật `project-status.yaml` theo `.claude/rules/common/project-status.md` — cập nhật `epics.{EPIC_ID}.features.{FEATURE_ID}.status`.
|
|
36
38
|
|
|
37
39
|
## Nguyên tắc
|
|
38
40
|
- Feature là một chức năng cụ thể, có thể demo được
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# /tas-fix $ARGUMENTS
|
|
2
|
+
|
|
3
|
+
Vai trò: SE - Software Engineer
|
|
4
|
+
Quick fix cho bug nhỏ hoặc lỗi rõ ràng — không cần tạo ticket, không cần full lifecycle.
|
|
5
|
+
Dùng khi: solo dev, hotfix nhanh, bug tìm thấy trong lúc dev.
|
|
6
|
+
Khác với /tas-bug: không tạo Bug file, không track status, không deploy flow.
|
|
7
|
+
|
|
8
|
+
## Stack Detection
|
|
9
|
+
Đọc `.claude/rules/common/stack-detection.md`.
|
|
10
|
+
|
|
11
|
+
## Hành động
|
|
12
|
+
|
|
13
|
+
### 1. Hiểu bug
|
|
14
|
+
$ARGUMENTS là mô tả lỗi, error message, hoặc file:line_number.
|
|
15
|
+
- Nếu có error message/stack trace: parse ngay, xác định file và dòng lỗi
|
|
16
|
+
- Nếu chỉ có mô tả: hỏi 1 câu duy nhất để làm rõ (reproduce steps hoặc expected vs actual)
|
|
17
|
+
- KHÔNG hỏi nhiều hơn 1 câu
|
|
18
|
+
|
|
19
|
+
### 2. Diagnose (tối đa 3 file đọc)
|
|
20
|
+
- Đọc file lỗi và các file liên quan trực tiếp
|
|
21
|
+
- Xác định root cause trong 1-2 câu ngắn
|
|
22
|
+
- KHÔNG đọc toàn bộ project, KHÔNG quét cấu trúc folder
|
|
23
|
+
- Nếu cần đọc thêm file ngoài 3 file đầu tiên: hỏi user xác nhận
|
|
24
|
+
|
|
25
|
+
### 3. Fix với regression test
|
|
26
|
+
|
|
27
|
+
Trước khi fix, đọc các rules liên quan:
|
|
28
|
+
- `.claude/rules/common/security.md` — kiểm tra fix có tạo ra security risk không
|
|
29
|
+
- `.claude/rules/common/testing.md` — pattern viết regression test
|
|
30
|
+
- `.claude/rules/[lang_rules]/coding-style.md` — conventions của stack hiện tại (nếu xác định được)
|
|
31
|
+
|
|
32
|
+
Sau đó:
|
|
33
|
+
a. Viết 1 test case tối thiểu reproduce bug (nếu project có test framework)
|
|
34
|
+
b. Xác nhận test FAIL
|
|
35
|
+
c. Fix code đúng root cause
|
|
36
|
+
d. Xác nhận test PASS
|
|
37
|
+
e. Chạy nhanh test suite nếu có (để check regression)
|
|
38
|
+
|
|
39
|
+
### 4. Wrap up
|
|
40
|
+
- Output commit message: `fix: <mô tả ngắn gọn>`
|
|
41
|
+
- Nhắc: "Nếu bug này có khả năng tái phát hoặc ảnh hưởng production, cân nhắc dùng /tas-bug để track đầy đủ."
|
|
42
|
+
|
|
43
|
+
## Nguyên tắc
|
|
44
|
+
- Tổng số file đọc ≤ 3 trừ khi được cho phép
|
|
45
|
+
- Fix đúng root cause, KHÔNG patch symptom
|
|
46
|
+
- Nếu fix kéo theo thay đổi architecture → dừng, gợi ý dùng /tas-bug + /tas-adr
|
|
47
|
+
- Nếu bug thuộc production và severity cao → dừng, gợi ý dùng /tas-bug với severity Critical/High
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# /tas-plan $ARGUMENTS
|
|
2
|
+
|
|
3
|
+
Vai trò: SE - Software Engineer
|
|
4
|
+
Cầu nối giữa nghiệp vụ (Story) và kỹ thuật (code).
|
|
5
|
+
Phân tích Story, lập kế hoạch kỹ thuật, break tasks — trước khi bắt đầu implement.
|
|
6
|
+
|
|
7
|
+
**Output bắt buộc:** Technical Plan được ghi vào Story file + `plan_status: completed`.
|
|
8
|
+
|
|
9
|
+
## Always / Ask / Never
|
|
10
|
+
|
|
11
|
+
| | Hành động |
|
|
12
|
+
|---|---|
|
|
13
|
+
| **Always** | Đọc Story file trước khi làm bất cứ điều gì |
|
|
14
|
+
| **Always** | Chờ user approve plan trước khi ghi vào Story |
|
|
15
|
+
| **Always** | Ghi Technical Plan vào Story file sau khi approved |
|
|
16
|
+
| **Ask** | Khi cần tham khảo SAD/ADR — xác nhận với user trước khi đọc |
|
|
17
|
+
| **Ask** | Khi Story scope > 8 giờ — gợi ý tách Story |
|
|
18
|
+
| **Never** | Bắt đầu implement ở command này |
|
|
19
|
+
| **Never** | Tự đọc SAD/ADR mà không hỏi user trước |
|
|
20
|
+
| **Never** | Ghi plan vào Story mà chưa có approval |
|
|
21
|
+
|
|
22
|
+
## Hành động
|
|
23
|
+
|
|
24
|
+
### Bước 1 — Xác định Story
|
|
25
|
+
|
|
26
|
+
`$ARGUMENTS` có thể là: Story ID (`Story-005`), file path, hoặc mô tả Story.
|
|
27
|
+
|
|
28
|
+
- Nếu là Story ID: tìm file qua glob `docs/epics/**/*-Story-{ID}-*.md`
|
|
29
|
+
- Nếu là file path: đọc trực tiếp
|
|
30
|
+
- Nếu là mô tả: hỏi user Story ID/file cụ thể
|
|
31
|
+
- Đọc Story file
|
|
32
|
+
|
|
33
|
+
**Check re-plan:** Nếu `plan_status: completed` → hỏi user:
|
|
34
|
+
> "Story này đã có Technical Plan rồi. Bạn muốn lập lại kế hoạch không?"
|
|
35
|
+
Nếu user xác nhận → tiếp tục. Nếu không → dừng.
|
|
36
|
+
|
|
37
|
+
### Bước 2 — Parallel Context Gathering
|
|
38
|
+
|
|
39
|
+
Launch 2 agents ĐỒNG THỜI:
|
|
40
|
+
|
|
41
|
+
**Agent 1 — `code-explorer`** (luôn chạy):
|
|
42
|
+
> Khảo sát codebase liên quan đến Story: "{Story title + tóm tắt AC}".
|
|
43
|
+
> Tìm: entry points, files có khả năng thay đổi, existing patterns, dependencies.
|
|
44
|
+
> Đọc tối đa 10 files liên quan nhất.
|
|
45
|
+
> Trả về: map ngắn gọn — what exists, what needs to change, potential conflicts.
|
|
46
|
+
|
|
47
|
+
**Agent 2 — `architect`** (chỉ chạy khi Story có dấu hiệu thay đổi kiến trúc:
|
|
48
|
+
thêm service/module mới, thay đổi data flow, tích hợp external system,
|
|
49
|
+
thay đổi database schema, thêm mới design pattern):
|
|
50
|
+
> Đánh giá architectural implications của Story: "{Story title}".
|
|
51
|
+
> Đọc `docs/sad.md` (nếu tồn tại) và files trong `docs/adr/`.
|
|
52
|
+
> Đọc `.claude/rules/common/patterns.md`.
|
|
53
|
+
> Trả về: ADR nào liên quan, patterns cần follow, rủi ro kiến trúc, constraints.
|
|
54
|
+
|
|
55
|
+
Chờ TẤT CẢ agents xong, tổng hợp findings.
|
|
56
|
+
|
|
57
|
+
### Bước 3 — Hỏi về SAD/ADR (nếu chưa rõ)
|
|
58
|
+
|
|
59
|
+
Sau khi xem findings từ agents, nếu cần tham khảo thêm SAD hoặc ADR cụ thể:
|
|
60
|
+
> "Tôi cần đọc thêm [SAD / ADR-XXX] để làm rõ [lý do]. Được không?"
|
|
61
|
+
|
|
62
|
+
Chỉ đọc sau khi user xác nhận.
|
|
63
|
+
|
|
64
|
+
### Bước 4 — Phân tích kỹ thuật
|
|
65
|
+
|
|
66
|
+
Dựa trên Story + agent findings, liệt kê rõ:
|
|
67
|
+
|
|
68
|
+
**Files sẽ thay đổi:**
|
|
69
|
+
| File | Thay đổi gì | Lý do |
|
|
70
|
+
|------|-------------|-------|
|
|
71
|
+
|
|
72
|
+
**Files mới cần tạo** (nếu có):
|
|
73
|
+
| File | Mục đích |
|
|
74
|
+
|------|----------|
|
|
75
|
+
|
|
76
|
+
**Database changes** (nếu có): migration, schema changes, seed data
|
|
77
|
+
|
|
78
|
+
**Config/Infrastructure changes** (nếu có): env vars, feature flags, dependencies mới
|
|
79
|
+
|
|
80
|
+
**Cần cập nhật SAD?** Yes/No + lý do ngắn gọn
|
|
81
|
+
|
|
82
|
+
**Cần tạo ADR mới?** Yes/No + lý do ngắn gọn
|
|
83
|
+
|
|
84
|
+
### Bước 5 — Đề xuất approach
|
|
85
|
+
|
|
86
|
+
Nếu có nhiều cách làm khả thi, liệt kê 2-3 options:
|
|
87
|
+
```
|
|
88
|
+
Option A: [mô tả ngắn]
|
|
89
|
+
+ [ưu điểm]
|
|
90
|
+
- [nhược điểm]
|
|
91
|
+
|
|
92
|
+
Option B: [mô tả ngắn]
|
|
93
|
+
+ [ưu điểm]
|
|
94
|
+
- [nhược điểm]
|
|
95
|
+
```
|
|
96
|
+
Đề xuất option tốt nhất và lý do. Nếu chỉ có 1 cách → trình bày trực tiếp.
|
|
97
|
+
|
|
98
|
+
### Bước 6 — Break Tasks
|
|
99
|
+
|
|
100
|
+
Breakdown thành tasks theo thứ tự implement. Mỗi task ~1-2 giờ:
|
|
101
|
+
```
|
|
102
|
+
- [ ] Task 1: [hành động cụ thể — file nào, thay đổi gì]
|
|
103
|
+
- [ ] Task 2: [hành động cụ thể]
|
|
104
|
+
- [ ] Task 3: Viết unit tests cho [AC-1, AC-2...]
|
|
105
|
+
- [ ] Task 4: [nếu cần] Tạo ADR / cập nhật SAD
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Nếu tổng estimate > 8 giờ → gợi ý tách Story trước khi tiếp tục.
|
|
109
|
+
|
|
110
|
+
### Bước 7 — Chờ approval
|
|
111
|
+
|
|
112
|
+
**DỪNG LẠI.** Hiển thị toàn bộ plan và hỏi:
|
|
113
|
+
> "Technical Plan trên có OK không? Muốn điều chỉnh gì không?"
|
|
114
|
+
|
|
115
|
+
- Nếu user approve → Bước 8
|
|
116
|
+
- Nếu user có feedback → cập nhật plan, hỏi lại
|
|
117
|
+
- KHÔNG ghi gì vào Story trước khi có approval
|
|
118
|
+
|
|
119
|
+
### Bước 8 — Ghi Technical Plan vào Story
|
|
120
|
+
|
|
121
|
+
Sau khi approved, cập nhật Story file:
|
|
122
|
+
|
|
123
|
+
**1. Thêm section `## Technical Plan`** vào Story (thay thế comment placeholder):
|
|
124
|
+
|
|
125
|
+
```markdown
|
|
126
|
+
## Technical Plan
|
|
127
|
+
> **Plan by:** {SE name} | **Date:** {ngày hiện tại}
|
|
128
|
+
|
|
129
|
+
### Approach
|
|
130
|
+
{Mô tả ngắn về approach đã chọn và lý do}
|
|
131
|
+
|
|
132
|
+
### Files to Change
|
|
133
|
+
| File | Change | Reason |
|
|
134
|
+
|------|--------|--------|
|
|
135
|
+
|
|
136
|
+
### Files to Create
|
|
137
|
+
| File | Purpose |
|
|
138
|
+
|------|---------|
|
|
139
|
+
|
|
140
|
+
### Database Changes
|
|
141
|
+
{Nếu không có: "None"}
|
|
142
|
+
|
|
143
|
+
### Config Changes
|
|
144
|
+
{Nếu không có: "None"}
|
|
145
|
+
|
|
146
|
+
### Architecture Notes
|
|
147
|
+
- SAD update needed: Yes/No
|
|
148
|
+
- New ADR needed: Yes/No — {tiêu đề nếu Yes}
|
|
149
|
+
|
|
150
|
+
### Tasks
|
|
151
|
+
- [ ] Task 1: ...
|
|
152
|
+
- [ ] Task 2: ...
|
|
153
|
+
- [ ] Task 3: Viết unit tests
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
**2. Cập nhật frontmatter:**
|
|
157
|
+
- `plan_status: completed`
|
|
158
|
+
- `plan_date: {ngày giờ hiện tại}`
|
|
159
|
+
|
|
160
|
+
**3. Cập nhật `project-status.yaml`:**
|
|
161
|
+
- `last_updated: {ngày hiện tại}`
|
|
162
|
+
- `epics.{EPIC_ID}.features.{FEATURE_ID}.stories.{STORY_ID}.plan_status: completed`
|
|
163
|
+
|
|
164
|
+
**4. Nếu cần ADR:** chạy `/tas-adr "{Tiêu đề quyết định}"` ngay sau khi ghi plan xong.
|
|
165
|
+
|
|
166
|
+
### Bước 9 — Thông báo next step
|
|
167
|
+
> "Technical Plan đã ghi vào Story. SE có thể bắt đầu implement với `/tas-dev {Story-ID}`."
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## Quick Mode (require_plan: false trong tas.yaml)
|
|
172
|
+
|
|
173
|
+
Dành cho: solo dev, prototype, spike, hotfix khẩn.
|
|
174
|
+
|
|
175
|
+
- `/tas-dev` sẽ KHÔNG bắt buộc chạy `/tas-plan` trước
|
|
176
|
+
- `/tas-plan` vẫn có thể chạy tự nguyện khi Story phức tạp
|
|
177
|
+
- Trade-off: tốc độ cao hơn, traceability thấp hơn
|
|
178
|
+
|
|
179
|
+
## Nguyên tắc
|
|
180
|
+
- Technical Plan sống trong Story file — không tạo file plan riêng
|
|
181
|
+
- Mỗi task ~1-2 giờ; cả Story ~4-8 giờ
|
|
182
|
+
- Nếu estimate > 8 giờ → tách Story
|
|
183
|
+
- Nếu task ảnh hưởng architecture → suggest ADR
|
|
184
|
+
- Giữ plan ngắn gọn, actionable — không viết essay
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
# /tas-prd $ARGUMENTS
|
|
2
2
|
|
|
3
3
|
Vai trò: PE - Product Engineer
|
|
4
4
|
Tạo hoặc cập nhật Product Requirements Document.
|
|
@@ -16,12 +16,14 @@ Tạo hoặc cập nhật Product Requirements Document.
|
|
|
16
16
|
- Các tính năng cốt lõi?
|
|
17
17
|
- Ràng buộc kỹ thuật/kinh doanh?
|
|
18
18
|
6. Tạo file docs/prd.md theo template
|
|
19
|
+
7. Cập nhật `project-status.yaml` theo `.claude/rules/common/project-status.md` — thêm `artifacts.prd`.
|
|
19
20
|
|
|
20
21
|
### Chế độ UPDATE (file đã tồn tại):
|
|
21
22
|
3. Cần context từ docs/prd.md hiện tại
|
|
22
23
|
4. $ARGUMENTS là mô tả thay đổi. Nếu không có, hỏi user cần cập nhật section nào.
|
|
23
24
|
5. Cập nhật file, giữ nguyên các section không thay đổi
|
|
24
25
|
6. Thêm dòng vào section Changelog cuối file: ngày, mô tả thay đổi
|
|
26
|
+
7. Cập nhật `project-status.yaml` theo `.claude/rules/common/project-status.md` — cập nhật `artifacts.prd`.
|
|
25
27
|
|
|
26
28
|
## Nguyên tắc
|
|
27
29
|
- Viết ở mức đủ chi tiết để SE có thể hiểu và thiết kế kiến trúc
|