dw-kit 1.0.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/executor.md +80 -0
- package/.claude/agents/planner.md +100 -0
- package/.claude/agents/quality-checker.md +86 -0
- package/.claude/agents/researcher.md +93 -0
- package/.claude/agents/reviewer.md +126 -0
- package/.claude/hooks/post-write.sh +62 -0
- package/.claude/hooks/pre-commit-gate.sh +90 -0
- package/.claude/hooks/progress-ping.sh +47 -0
- package/.claude/hooks/safety-guard.sh +54 -0
- package/.claude/rules/code-style.md +37 -0
- package/.claude/rules/commit-standards.md +37 -0
- package/.claude/rules/workflow-rules.md +62 -0
- package/.claude/settings.json +71 -0
- package/.claude/settings.local.json +12 -0
- package/.claude/skills/dw-arch-review/SKILL.md +119 -0
- package/.claude/skills/dw-archive/SKILL.md +81 -0
- package/.claude/skills/dw-commit/SKILL.md +81 -0
- package/.claude/skills/dw-config-init/SKILL.md +91 -0
- package/.claude/skills/dw-config-validate/SKILL.md +75 -0
- package/.claude/skills/dw-dashboard/SKILL.md +209 -0
- package/.claude/skills/dw-debug/SKILL.md +97 -0
- package/.claude/skills/dw-docs-update/SKILL.md +125 -0
- package/.claude/skills/dw-estimate/SKILL.md +90 -0
- package/.claude/skills/dw-execute/SKILL.md +98 -0
- package/.claude/skills/dw-flow/SKILL.md +274 -0
- package/.claude/skills/dw-handoff/SKILL.md +81 -0
- package/.claude/skills/dw-log-work/SKILL.md +69 -0
- package/.claude/skills/dw-plan/SKILL.md +125 -0
- package/.claude/skills/dw-plan/template-plan.md +47 -0
- package/.claude/skills/dw-requirements/SKILL.md +98 -0
- package/.claude/skills/dw-research/SKILL.md +98 -0
- package/.claude/skills/dw-research/template-research.md +51 -0
- package/.claude/skills/dw-review/SKILL.md +66 -0
- package/.claude/skills/dw-review/checklist.md +88 -0
- package/.claude/skills/dw-rollback/SKILL.md +90 -0
- package/.claude/skills/dw-sprint-review/SKILL.md +99 -0
- package/.claude/skills/dw-task-init/SKILL.md +59 -0
- package/.claude/skills/dw-test-plan/SKILL.md +113 -0
- package/.claude/skills/dw-thinking/SKILL.md +70 -0
- package/.claude/skills/dw-thinking/THINKING.md +91 -0
- package/.claude/skills/dw-upgrade/SKILL.md +82 -0
- package/.claude/templates/en/task-context.md +73 -0
- package/.claude/templates/en/task-plan.md +79 -0
- package/.claude/templates/en/task-progress.md +65 -0
- package/.claude/templates/pr-template.md +56 -0
- package/.claude/templates/task-context.md +73 -0
- package/.claude/templates/task-plan.md +79 -0
- package/.claude/templates/task-progress.md +65 -0
- package/.dw/adapters/claude-cli/extensions/.gitkeep +0 -0
- package/.dw/adapters/claude-cli/extensions/README.md +36 -0
- package/.dw/adapters/claude-cli/generated/README.md +23 -0
- package/.dw/adapters/claude-cli/generated/agents/.gitkeep +0 -0
- package/.dw/adapters/claude-cli/generated/skills/.gitkeep +0 -0
- package/.dw/adapters/claude-cli/overrides/README.md +35 -0
- package/.dw/adapters/claude-cli/overrides/agents/.gitkeep +0 -0
- package/.dw/adapters/claude-cli/overrides/skills/.gitkeep +0 -0
- package/.dw/adapters/generic/AGENT.md +169 -0
- package/.dw/adapters/generic/README.md +21 -0
- package/.dw/config/config.schema.json +121 -0
- package/.dw/config/dw.config.yml +82 -0
- package/.dw/config/presets/enterprise.yml +52 -0
- package/.dw/config/presets/small-team.yml +39 -0
- package/.dw/config/presets/solo-quick.yml +37 -0
- package/.dw/core/QUALITY.md +220 -0
- package/.dw/core/ROLES.md +257 -0
- package/.dw/core/THINKING.md +126 -0
- package/.dw/core/WORKFLOW.md +450 -0
- package/.dw/core/templates/vi/task-context.md +92 -0
- package/.dw/core/templates/vi/task-plan.md +93 -0
- package/.dw/core/templates/vi/task-progress.md +56 -0
- package/CLAUDE.md +98 -0
- package/LICENSE +21 -0
- package/README.md +183 -0
- package/bin/dw.mjs +28 -0
- package/package.json +52 -0
- package/scripts/e2e-local-check.sh +76 -0
- package/scripts/migrate-v03-to-v1.sh +243 -0
- package/scripts/upgrade.sh +246 -0
- package/setup.sh +382 -0
- package/src/cli.mjs +68 -0
- package/src/commands/doctor.mjs +149 -0
- package/src/commands/init.mjs +332 -0
- package/src/commands/migrate.mjs +215 -0
- package/src/commands/upgrade.mjs +262 -0
- package/src/commands/validate.mjs +102 -0
- package/src/lib/config.mjs +75 -0
- package/src/lib/copy.mjs +110 -0
- package/src/lib/platform.mjs +39 -0
- package/src/lib/ui.mjs +66 -0
- package/src/smoke-test.mjs +315 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dw-config-validate
|
|
3
|
+
description: "Kiểm tra .dw/config/dw.config.yml có hợp lệ không. Phát hiện unknown keys, typos, invalid values. Chạy sau khi sửa config thủ công."
|
|
4
|
+
argument-hint: ""
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Validate Config
|
|
8
|
+
|
|
9
|
+
Kiểm tra `.dw/config/dw.config.yml` trong project hiện tại.
|
|
10
|
+
|
|
11
|
+
## Bước 1: Đọc config
|
|
12
|
+
|
|
13
|
+
Đọc toàn bộ `.dw/config/dw.config.yml`.
|
|
14
|
+
|
|
15
|
+
## Bước 2: Kiểm tra top-level keys
|
|
16
|
+
|
|
17
|
+
**Known top-level keys:**
|
|
18
|
+
```
|
|
19
|
+
project, level, team, flags, routing, estimation, metrics, paths
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Nếu có key nào khác → **WARN**: "Unknown top-level key: `[key]` — có thể là typo?"
|
|
23
|
+
|
|
24
|
+
## Bước 3: Kiểm tra `flags` keys
|
|
25
|
+
|
|
26
|
+
**Known flag keys:**
|
|
27
|
+
```
|
|
28
|
+
research, plan, execute, commit, review, debug,
|
|
29
|
+
living_docs, docs_update_on_commit,
|
|
30
|
+
estimation, log_work, metrics_tracking, dora_metrics,
|
|
31
|
+
pre_commit_tests, pre_commit_lint, block_commit_on_fail,
|
|
32
|
+
handoff, thinking_framework,
|
|
33
|
+
requirements_skill, test_plan_skill, arch_review_skill, dashboard_skill
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Nếu có flag key nào khác → **WARN**: "Unknown flag: `[key]` — có thể là typo? Flag này sẽ bị ignore."
|
|
37
|
+
|
|
38
|
+
## Bước 4: Kiểm tra flag values
|
|
39
|
+
|
|
40
|
+
Mỗi flag phải có giá trị `true`, `false`, hoặc `"skip"`.
|
|
41
|
+
Nếu giá trị khác → **ERROR**: "Flag `[key]` có giá trị không hợp lệ: `[value]`. Phải là true | false | \"skip\"."
|
|
42
|
+
|
|
43
|
+
## Bước 5: Kiểm tra `level`
|
|
44
|
+
|
|
45
|
+
- Phải là `1`, `2`, hoặc `3`.
|
|
46
|
+
- Nếu `level: 3` → **INFO**: "Level 3 đang ở beta — living docs automation, DORA auto-calculation, và dashboard HTML export chưa fully implemented."
|
|
47
|
+
|
|
48
|
+
## Bước 6: Kiểm tra `project.language`
|
|
49
|
+
|
|
50
|
+
- Phải là `"vi"` hoặc `"en"`.
|
|
51
|
+
- Nếu `"en"` → kiểm tra `.claude/templates/en/` có tồn tại không. Nếu không → **WARN**: "English templates chưa có. Chạy `/dw-upgrade` để lấy templates mới nhất."
|
|
52
|
+
|
|
53
|
+
## Bước 7: Báo cáo kết quả
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
=== Config Validation Report ===
|
|
57
|
+
|
|
58
|
+
File: .dw/config/dw.config.yml
|
|
59
|
+
Project: [project.name]
|
|
60
|
+
Level: [level]
|
|
61
|
+
Language: [language]
|
|
62
|
+
|
|
63
|
+
ERRORS (phải fix):
|
|
64
|
+
[danh sách lỗi nếu có]
|
|
65
|
+
|
|
66
|
+
WARNINGS (nên xem xét):
|
|
67
|
+
[danh sách warnings nếu có]
|
|
68
|
+
|
|
69
|
+
INFO:
|
|
70
|
+
[thông tin thêm]
|
|
71
|
+
|
|
72
|
+
[OK] Config hợp lệ / [FAIL] Có X error(s) cần fix
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Nếu không có lỗi: "Config hợp lệ. X flags đang bật, Y flags đang tắt."
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dw-dashboard
|
|
3
|
+
description: "Tạo báo cáo tổng hợp cho PM: trạng thái tasks, metrics DORA, effort tracking, velocity. Ghi ra file report để share."
|
|
4
|
+
argument-hint: "[sprint-name | period: last-week | last-month | all]"
|
|
5
|
+
allowed-tools:
|
|
6
|
+
- Read
|
|
7
|
+
- Glob
|
|
8
|
+
- Grep
|
|
9
|
+
- "Bash(git log *)"
|
|
10
|
+
- "Bash(git diff *)"
|
|
11
|
+
- "Bash(ls *)"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# PM Dashboard — Báo Cáo Dự Án
|
|
15
|
+
|
|
16
|
+
Period: **$ARGUMENTS**
|
|
17
|
+
|
|
18
|
+
## Đọc Config
|
|
19
|
+
|
|
20
|
+
Đọc `.dw/config/dw.config.yml`:
|
|
21
|
+
- `paths.tasks` → location task docs
|
|
22
|
+
- `tracking.log_work` → có data effort tracking không
|
|
23
|
+
- `workflow.default_depth` → level of reporting detail
|
|
24
|
+
|
|
25
|
+
## Thu Thập Dữ Liệu
|
|
26
|
+
|
|
27
|
+
### 1. Tasks Overview
|
|
28
|
+
```bash
|
|
29
|
+
ls {paths.tasks}/ # danh sách tasks
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Đọc từng `*-progress.md` để lấy:
|
|
33
|
+
- Trạng thái (Not Started / In Progress / Blocked / Done)
|
|
34
|
+
- Subtasks done/total
|
|
35
|
+
- Blockers hiện tại
|
|
36
|
+
|
|
37
|
+
### 2. Git Metrics (DORA)
|
|
38
|
+
```bash
|
|
39
|
+
# Commits trong period
|
|
40
|
+
git log --oneline --after="[start-date]" --before="[end-date]"
|
|
41
|
+
|
|
42
|
+
# Lead time: time from first commit to merge
|
|
43
|
+
git log --format="%H %ad" --date=short
|
|
44
|
+
|
|
45
|
+
# Frequency
|
|
46
|
+
git log --format="%ad" --date=short | sort | uniq -c
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### 3. Effort Data
|
|
50
|
+
Đọc `{.dw/metrics}/effort-log.json` nếu có.
|
|
51
|
+
|
|
52
|
+
### 4. Quality Metrics
|
|
53
|
+
Đọc review reports (nếu có) để lấy:
|
|
54
|
+
- Critical issues found/fixed
|
|
55
|
+
- Test coverage trend
|
|
56
|
+
|
|
57
|
+
## Tính DORA Metrics
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
Deployment Frequency = commits merged / working days
|
|
61
|
+
Lead Time = avg(merge_date - first_commit_date) per feature
|
|
62
|
+
Change Failure Rate = (hotfixes + rollbacks) / total deploys × 100%
|
|
63
|
+
MTTR = avg time from incident_detected to resolved
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
So sánh với thresholds trong config và xếp loại: Elite / High / Medium / Low.
|
|
67
|
+
|
|
68
|
+
## Tính DORA Tự Động Từ Git
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
# Deployment frequency (commits/merges per day trong period)
|
|
72
|
+
git log --oneline --after="[start]" --before="[end]" | wc -l
|
|
73
|
+
|
|
74
|
+
# Lead time: trung bình từ commit đầu đến commit cuối của mỗi feature branch
|
|
75
|
+
git log --format="%H %ad %s" --date=iso --after="[start]"
|
|
76
|
+
|
|
77
|
+
# Change failure rate: đếm commits có message chứa "fix", "hotfix", "revert"
|
|
78
|
+
git log --oneline --after="[start]" | grep -iE "(hotfix|revert|fix:)" | wc -l
|
|
79
|
+
|
|
80
|
+
# MTTR: thời gian từ "fix commit" đến "hotfix commit" liền sau (nếu có)
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Xếp loại theo DORA elite benchmarks: Deployment Frequency (daily), Lead Time (<1h), MTTR (<1h), Change Failure Rate (<5%).
|
|
84
|
+
|
|
85
|
+
## Tạo Report (Markdown + HTML)
|
|
86
|
+
|
|
87
|
+
Ghi ra `{paths.reports}/dashboard-[date].md` VÀ `{paths.reports}/dashboard-[date].html`:
|
|
88
|
+
|
|
89
|
+
```markdown
|
|
90
|
+
# Dashboard: [Project Name]
|
|
91
|
+
## Period: $ARGUMENTS | Generated: [date]
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## 🎯 Tóm Tắt Nhanh (Executive Summary)
|
|
96
|
+
|
|
97
|
+
| Metric | Giá trị | Trend | Target |
|
|
98
|
+
|--------|---------|-------|--------|
|
|
99
|
+
| Tasks Done | X/Y | ↑ | |
|
|
100
|
+
| Velocity | Xh/week | → | |
|
|
101
|
+
| Blocked Tasks | X | ↓ better | 0 |
|
|
102
|
+
| Estimation Accuracy | X% | | >80% |
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## 📋 Trạng Thái Tasks
|
|
107
|
+
|
|
108
|
+
| Task | Trạng thái | Progress | Blockers | ETA |
|
|
109
|
+
|------|-----------|----------|----------|-----|
|
|
110
|
+
| task-a | ✅ Done | 100% | — | — |
|
|
111
|
+
| task-b | 🔄 In Progress | 60% | — | [date] |
|
|
112
|
+
| task-c | ❌ Blocked | 30% | [mô tả] | TBD |
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## 📊 DORA Metrics
|
|
117
|
+
|
|
118
|
+
| Metric | Giá trị | Level | Mục tiêu |
|
|
119
|
+
|--------|---------|-------|----------|
|
|
120
|
+
| Deployment Frequency | X/week | 🟡 High | Elite: daily |
|
|
121
|
+
| Lead Time | X days | 🟢 High | Elite: <1 day |
|
|
122
|
+
| Change Failure Rate | X% | 🟢 Elite | <5% |
|
|
123
|
+
| MTTR | X hours | 🟡 High | Elite: <1h |
|
|
124
|
+
|
|
125
|
+
> Thang điểm: 🟢 Elite | 🔵 High | 🟡 Medium | 🔴 Low
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## ⏱️ Effort & Velocity
|
|
130
|
+
|
|
131
|
+
| Dev | Estimated | Actual | Accuracy | Tasks |
|
|
132
|
+
|----|----------|--------|----------|-------|
|
|
133
|
+
| [name] | Xh | Yh | Z% | N |
|
|
134
|
+
| **Team** | **Xh** | **Yh** | **Z%** | **N** |
|
|
135
|
+
|
|
136
|
+
**Velocity**: X story-points/sprint (or X hours/week)
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## 🔍 Highlights
|
|
141
|
+
|
|
142
|
+
### ✅ Điểm tốt tuần này
|
|
143
|
+
- [Achievement 1]
|
|
144
|
+
|
|
145
|
+
### ⚠️ Rủi ro cần theo dõi
|
|
146
|
+
- [Risk 1] — Owner: [name]
|
|
147
|
+
|
|
148
|
+
### 🎯 Focus tuần tới
|
|
149
|
+
- [Priority 1]
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## HTML Report
|
|
153
|
+
|
|
154
|
+
File HTML được generate kèm với markdown:
|
|
155
|
+
|
|
156
|
+
```html
|
|
157
|
+
<!DOCTYPE html>
|
|
158
|
+
<html lang="vi">
|
|
159
|
+
<head>
|
|
160
|
+
<meta charset="UTF-8">
|
|
161
|
+
<title>Dashboard: [Project] — [Period]</title>
|
|
162
|
+
<style>
|
|
163
|
+
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
164
|
+
max-width: 960px; margin: 40px auto; padding: 0 20px; color: #333; }
|
|
165
|
+
h1 { color: #1a1a2e; border-bottom: 3px solid #4361ee; padding-bottom: 8px; }
|
|
166
|
+
h2 { color: #16213e; margin-top: 32px; }
|
|
167
|
+
table { width: 100%; border-collapse: collapse; margin: 16px 0; }
|
|
168
|
+
th { background: #4361ee; color: white; padding: 10px 12px; text-align: left; }
|
|
169
|
+
td { padding: 9px 12px; border-bottom: 1px solid #e9ecef; }
|
|
170
|
+
tr:hover { background: #f8f9fa; }
|
|
171
|
+
.badge-elite { background: #2ecc71; color: white; padding: 2px 8px; border-radius: 12px; font-size: 12px; }
|
|
172
|
+
.badge-high { background: #3498db; color: white; padding: 2px 8px; border-radius: 12px; font-size: 12px; }
|
|
173
|
+
.badge-medium{ background: #f39c12; color: white; padding: 2px 8px; border-radius: 12px; font-size: 12px; }
|
|
174
|
+
.badge-low { background: #e74c3c; color: white; padding: 2px 8px; border-radius: 12px; font-size: 12px; }
|
|
175
|
+
.summary-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin: 20px 0; }
|
|
176
|
+
.summary-card { background: #f8f9fa; border-left: 4px solid #4361ee;
|
|
177
|
+
padding: 16px; border-radius: 4px; }
|
|
178
|
+
.summary-card .value { font-size: 28px; font-weight: 700; color: #4361ee; }
|
|
179
|
+
.summary-card .label { font-size: 13px; color: #666; margin-top: 4px; }
|
|
180
|
+
footer { margin-top: 48px; font-size: 12px; color: #999; border-top: 1px solid #eee; padding-top: 12px; }
|
|
181
|
+
</style>
|
|
182
|
+
</head>
|
|
183
|
+
<body>
|
|
184
|
+
<h1>Dashboard: [Project Name]</h1>
|
|
185
|
+
<p>Period: <strong>[period]</strong> | Generated: [date]</p>
|
|
186
|
+
|
|
187
|
+
<div class="summary-grid">
|
|
188
|
+
<div class="summary-card"><div class="value">[X/Y]</div><div class="label">Tasks Done</div></div>
|
|
189
|
+
<div class="summary-card"><div class="value">[X]h</div><div class="label">Velocity / week</div></div>
|
|
190
|
+
<div class="summary-card"><div class="value">[X]%</div><div class="label">Est. Accuracy</div></div>
|
|
191
|
+
<div class="summary-card"><div class="value">[X]</div><div class="label">Blocked Tasks</div></div>
|
|
192
|
+
</div>
|
|
193
|
+
|
|
194
|
+
<!-- Tasks table, DORA table, Effort table — populate từ data thu thập -->
|
|
195
|
+
[CONTENT_PLACEHOLDER]
|
|
196
|
+
|
|
197
|
+
<footer>Generated by dv-workflow-kit | <a href="../.dw/tasks/">Task Docs</a></footer>
|
|
198
|
+
</body>
|
|
199
|
+
</html>
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
Điền `[CONTENT_PLACEHOLDER]` với các bảng HTML tương ứng với nội dung markdown report.
|
|
203
|
+
|
|
204
|
+
## Lưu & Thông Báo
|
|
205
|
+
|
|
206
|
+
Sau khi tạo:
|
|
207
|
+
- Thông báo đường dẫn: `{paths.reports}/dashboard-[date].md` và `.html`
|
|
208
|
+
- Tóm tắt 3-5 bullets cho PM đọc nhanh
|
|
209
|
+
- Gợi ý: "Mở file .html trong browser để xem report đẹp hơn. Share .md qua Slack/email."
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dw-debug
|
|
3
|
+
description: "Debug có hệ thống theo quy trình Investigate → Diagnose → Fix. Dùng khi gặp lỗi, test fail, hoặc behavior bất thường."
|
|
4
|
+
argument-hint: "[mô tả vấn đề]"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Debug Có Hệ Thống
|
|
8
|
+
|
|
9
|
+
Vấn đề: **$ARGUMENTS**
|
|
10
|
+
|
|
11
|
+
## Đọc Config
|
|
12
|
+
|
|
13
|
+
Đọc `.dw/config/dw.config.yml` → `paths.tasks`, `workflow.default_depth`.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Phase 1: INVESTIGATE — Thu thập thông tin
|
|
18
|
+
|
|
19
|
+
### 1.1 Xác định symptoms
|
|
20
|
+
- Error message đầy đủ là gì? (stack trace, log)
|
|
21
|
+
- Reproduction steps: làm gì để trigger lỗi?
|
|
22
|
+
- Xảy ra lần đầu khi nào? Có gì thay đổi gần đây?
|
|
23
|
+
- Tần suất: always / flaky / one-time?
|
|
24
|
+
- Môi trường: dev / staging / production?
|
|
25
|
+
|
|
26
|
+
### 1.2 Thu thập evidence
|
|
27
|
+
```bash
|
|
28
|
+
# Git: thay đổi gần đây
|
|
29
|
+
git log --oneline -10
|
|
30
|
+
git diff HEAD~3
|
|
31
|
+
|
|
32
|
+
# Tìm error trong code
|
|
33
|
+
grep -r "[error keyword]" --include="*.ts"
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### 1.3 Xác định phạm vi
|
|
37
|
+
- Feature nào bị ảnh hưởng?
|
|
38
|
+
- Chỉ 1 user hay tất cả?
|
|
39
|
+
- Data cụ thể nào trigger lỗi?
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Phase 2: DIAGNOSE — Tìm root cause
|
|
44
|
+
|
|
45
|
+
### 2.1 Đặt giả thuyết
|
|
46
|
+
Liệt kê 2-4 giả thuyết có thể về nguyên nhân, ưu tiên từ khả năng cao nhất.
|
|
47
|
+
|
|
48
|
+
### 2.2 Kiểm chứng từng giả thuyết
|
|
49
|
+
- Đọc code liên quan
|
|
50
|
+
- Trace data flow
|
|
51
|
+
- Kiểm tra config, environment variables
|
|
52
|
+
- Xem test coverage có bỏ sót case này không
|
|
53
|
+
|
|
54
|
+
### 2.3 Thu hẹp phạm vi
|
|
55
|
+
- Loại trừ dần từng giả thuyết
|
|
56
|
+
- Tìm exact line/function gây lỗi
|
|
57
|
+
- Xác định root cause (không phải symptom)
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Phase 3: FIX — Sửa và verify
|
|
62
|
+
|
|
63
|
+
### 3.1 Implement fix tối thiểu
|
|
64
|
+
- Fix đúng root cause, không phải workaround
|
|
65
|
+
- Không thay đổi scope ngoài bug fix
|
|
66
|
+
|
|
67
|
+
### 3.2 Viết regression test TRƯỚC khi fix
|
|
68
|
+
```
|
|
69
|
+
// Test phải FAIL trước fix, PASS sau fix
|
|
70
|
+
test("should handle [edge case that caused bug]", () => { ... })
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### 3.3 Verify
|
|
74
|
+
- Test mới pass
|
|
75
|
+
- Existing tests không bị break
|
|
76
|
+
- Manual verify reproduction steps
|
|
77
|
+
|
|
78
|
+
### 3.4 Ghi lại
|
|
79
|
+
|
|
80
|
+
```markdown
|
|
81
|
+
## Debug Report
|
|
82
|
+
|
|
83
|
+
**Root Cause**: [giải thích ngắn gọn]
|
|
84
|
+
**Fix**: [mô tả thay đổi]
|
|
85
|
+
**Prevention**: [làm sao tránh lặp lại]
|
|
86
|
+
**Test added**: [tên test]
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Khi Bị Bí
|
|
92
|
+
|
|
93
|
+
Nếu sau 2 giả thuyết vẫn không tìm được root cause:
|
|
94
|
+
1. Mô rộng hơn: xem toàn bộ data flow
|
|
95
|
+
2. Thêm logging tạm thời để narrow down
|
|
96
|
+
3. Bisect git: `git bisect` để tìm commit gây lỗi
|
|
97
|
+
4. Hỏi: trình bày findings cho user, propose next steps
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dw-docs-update
|
|
3
|
+
description: "Cập nhật living docs khi code thay đổi. Phát hiện docs lỗi thời và cập nhật tự động. Dùng sau khi execute hoặc commit."
|
|
4
|
+
argument-hint: "[scope: all | architecture | api | models | task-name]"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Cập Nhật Living Docs
|
|
8
|
+
|
|
9
|
+
Scope: **$ARGUMENTS**
|
|
10
|
+
|
|
11
|
+
## Đọc Config
|
|
12
|
+
|
|
13
|
+
Đọc `.dw/config/dw.config.yml` → kiểm tra:
|
|
14
|
+
- `paths.docs` → thư mục living docs (mặc định: `.dw/docs`)
|
|
15
|
+
- `workflow.default_depth` → nếu `quick`, gợi ý nhưng không bắt buộc
|
|
16
|
+
|
|
17
|
+
## Living Docs Structure
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
{paths.docs}/
|
|
21
|
+
├── ARCHITECTURE.md # Kiến trúc tổng quan hệ thống
|
|
22
|
+
├── API.md # API endpoints & contracts
|
|
23
|
+
├── DATA-MODELS.md # Database schema & data models
|
|
24
|
+
├── DECISIONS.md # Architecture Decision Records (ADR)
|
|
25
|
+
├── GLOSSARY.md # Thuật ngữ dự án
|
|
26
|
+
├── SETUP.md # Hướng dẫn setup & chạy dự án
|
|
27
|
+
└── modules/
|
|
28
|
+
└── [module-name].md # Docs riêng cho từng module
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Quy Trình
|
|
32
|
+
|
|
33
|
+
### Bước 0: Scaffold (lần đầu chạy)
|
|
34
|
+
|
|
35
|
+
Nếu `{paths.docs}/` không tồn tại hoặc trống → tạo cấu trúc ban đầu:
|
|
36
|
+
```bash
|
|
37
|
+
mkdir -p {paths.docs}/modules
|
|
38
|
+
```
|
|
39
|
+
Tạo các file skeleton: `ARCHITECTURE.md`, `API.md`, `DATA-MODELS.md`, `DECISIONS.md`, `GLOSSARY.md`, `SETUP.md`.
|
|
40
|
+
Thông báo: "Khởi tạo living docs tại `{paths.docs}/` — lần chạy đầu tiên."
|
|
41
|
+
|
|
42
|
+
### Nếu scope = "all" hoặc không có argument
|
|
43
|
+
|
|
44
|
+
1. **Detect changes**:
|
|
45
|
+
```bash
|
|
46
|
+
git diff --name-only HEAD~10 # 10 commits gần nhất
|
|
47
|
+
git diff --name-only --cached # staged changes
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
2. **Classify changes** theo pattern:
|
|
51
|
+
| Pattern file | Docs cần update |
|
|
52
|
+
|-------------|-----------------|
|
|
53
|
+
| `*model*`, `*schema*`, `*migration*`, `*entity*` | `DATA-MODELS.md` |
|
|
54
|
+
| `*route*`, `*controller*`, `*handler*`, `*endpoint*` | `API.md` |
|
|
55
|
+
| `*config*`, `*app.*`, `package.json`, `*.yml` | `ARCHITECTURE.md` |
|
|
56
|
+
| `*.md` trong project (không phải `.dw/docs/`) | Kiểm tra DECISIONS.md |
|
|
57
|
+
| Thư mục mới xuất hiện | `ARCHITECTURE.md` + tạo `modules/[name].md` |
|
|
58
|
+
|
|
59
|
+
3. **Stale check**: Với mỗi doc cần update, đọc nội dung hiện tại, so sánh với code thực tế. Ghi rõ: "Phần X đang mô tả Y nhưng code hiện tại là Z."
|
|
60
|
+
|
|
61
|
+
4. **Update**: Chỉ cập nhật những gì thực sự lỗi thời. Thêm timestamp cuối mỗi update.
|
|
62
|
+
|
|
63
|
+
### Nếu scope = "architecture"
|
|
64
|
+
- Đọc cấu trúc thư mục, main config files, entry points
|
|
65
|
+
- Cập nhật ARCHITECTURE.md với cấu trúc hiện tại
|
|
66
|
+
|
|
67
|
+
### Nếu scope = "api"
|
|
68
|
+
- Grep tất cả route/endpoint definitions
|
|
69
|
+
- Cập nhật API.md với danh sách endpoints hiện tại
|
|
70
|
+
|
|
71
|
+
### Nếu scope = "models"
|
|
72
|
+
- Đọc schema definitions, migration files, model files
|
|
73
|
+
- Cập nhật DATA-MODELS.md
|
|
74
|
+
|
|
75
|
+
### Nếu scope = [task-name]
|
|
76
|
+
- Đọc progress file của task
|
|
77
|
+
- Cập nhật docs liên quan đến thay đổi của task
|
|
78
|
+
|
|
79
|
+
## Khi Tạo Doc Mới (lần đầu)
|
|
80
|
+
|
|
81
|
+
Nếu file doc chưa tồn tại → tạo mới với cấu trúc chuẩn:
|
|
82
|
+
|
|
83
|
+
### ARCHITECTURE.md
|
|
84
|
+
```markdown
|
|
85
|
+
# Kiến Trúc Hệ Thống
|
|
86
|
+
|
|
87
|
+
## Tổng Quan
|
|
88
|
+
[Mô tả high-level]
|
|
89
|
+
|
|
90
|
+
## Tech Stack
|
|
91
|
+
| Layer | Technology |
|
|
92
|
+
|-------|-----------|
|
|
93
|
+
|
|
94
|
+
## Cấu Trúc Thư Mục
|
|
95
|
+
[Tree structure]
|
|
96
|
+
|
|
97
|
+
## Modules
|
|
98
|
+
| Module | Vai trò | Entry point |
|
|
99
|
+
|--------|---------|-------------|
|
|
100
|
+
|
|
101
|
+
## Data Flow
|
|
102
|
+
[Diagram]
|
|
103
|
+
|
|
104
|
+
## Cập nhật lần cuối: [date]
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### DECISIONS.md (ADR Format)
|
|
108
|
+
```markdown
|
|
109
|
+
# Architecture Decision Records
|
|
110
|
+
|
|
111
|
+
## ADR-001: [Tiêu đề]
|
|
112
|
+
- **Ngày**: [date]
|
|
113
|
+
- **Trạng thái**: Accepted | Superseded | Deprecated
|
|
114
|
+
- **Bối cảnh**: [Tại sao cần quyết định]
|
|
115
|
+
- **Quyết định**: [Đã chọn gì]
|
|
116
|
+
- **Hệ quả**: [Ảnh hưởng]
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Output
|
|
120
|
+
|
|
121
|
+
Sau khi cập nhật, báo cáo:
|
|
122
|
+
- Files đã cập nhật: [danh sách]
|
|
123
|
+
- Thay đổi chính: [tóm tắt]
|
|
124
|
+
- Docs vẫn có thể stale: [nếu có]
|
|
125
|
+
- Ghi timestamp "Cập nhật lần cuối" vào mỗi doc file
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dw-estimate
|
|
3
|
+
description: "Ước lượng effort cho task. Phân tích subtasks từ plan và đưa ra estimate theo đơn vị cấu hình (hours/story-points/t-shirt). Dùng sau /plan."
|
|
4
|
+
argument-hint: "[task-name]"
|
|
5
|
+
allowed-tools:
|
|
6
|
+
- Read
|
|
7
|
+
- Grep
|
|
8
|
+
- Glob
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Ước Lượng Effort
|
|
12
|
+
|
|
13
|
+
Task: **$ARGUMENTS**
|
|
14
|
+
|
|
15
|
+
## Đọc Config
|
|
16
|
+
|
|
17
|
+
Đọc `.dw/config/dw.config.yml`:
|
|
18
|
+
- `tracking.estimation` — nếu `false` → thông báo "Estimation chưa bật cho project này" và DỪNG
|
|
19
|
+
- `tracking.estimation_unit` → đơn vị (hours / story-points / t-shirt)
|
|
20
|
+
- `paths.tasks` → location task docs
|
|
21
|
+
|
|
22
|
+
## Điều Kiện
|
|
23
|
+
|
|
24
|
+
Nếu chưa có plan (`{paths.tasks}/$ARGUMENTS/$ARGUMENTS-plan.md`) → thông báo cần chạy `/dw-plan` trước.
|
|
25
|
+
|
|
26
|
+
## Quy Trình Estimation
|
|
27
|
+
|
|
28
|
+
### 1. Đọc plan & context
|
|
29
|
+
- Đọc toàn bộ subtasks
|
|
30
|
+
- Đọc context để hiểu technical complexity
|
|
31
|
+
- Hiểu dependencies giữa subtasks
|
|
32
|
+
|
|
33
|
+
### 2. Estimate từng subtask
|
|
34
|
+
|
|
35
|
+
Với mỗi subtask, phân tích:
|
|
36
|
+
- **Complexity**: Low / Medium / High
|
|
37
|
+
- Low: Rõ ràng, ít dependencies, code cũ đã có pattern
|
|
38
|
+
- Medium: Cần thiết kế, có vài dependencies
|
|
39
|
+
- High: Phức tạp, nhiều unknowns, cần research thêm
|
|
40
|
+
- **Uncertainty**: Low / Medium / High (có unknown chưa giải quyết?)
|
|
41
|
+
- **Estimate**: Dựa trên complexity + uncertainty
|
|
42
|
+
|
|
43
|
+
**Reference nhanh (hours):**
|
|
44
|
+
| Complexity | Low uncertainty | Medium | High uncertainty |
|
|
45
|
+
|-----------|-----------------|--------|-----------------|
|
|
46
|
+
| Low | 1-2h | 2-4h | 4-8h |
|
|
47
|
+
| Medium | 2-4h | 4-8h | 8-16h |
|
|
48
|
+
| High | 4-8h | 8-16h | 16-40h |
|
|
49
|
+
|
|
50
|
+
**Reference (story points - Fibonacci):** 1, 2, 3, 5, 8, 13, 21
|
|
51
|
+
**Reference (t-shirt):** XS(<2h), S(2-4h), M(4-8h), L(8-16h), XL(16-40h), XXL(>40h)
|
|
52
|
+
|
|
53
|
+
### 3. Uncertainty buffer
|
|
54
|
+
|
|
55
|
+
- Low uncertainty overall: +0%
|
|
56
|
+
- Medium: +20%
|
|
57
|
+
- High: +50%
|
|
58
|
+
- Nhiều unknowns / first-time tech: +100% (double)
|
|
59
|
+
|
|
60
|
+
### 4. Breakdown theo categories
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
Research: [X]
|
|
64
|
+
Planning: [done]
|
|
65
|
+
Coding: [X per subtask]
|
|
66
|
+
Testing: [X — thường 20-30% coding]
|
|
67
|
+
Review: [X — thường 10-15% coding]
|
|
68
|
+
Documentation: [X — nếu living docs bật]
|
|
69
|
+
Buffer: [X%]
|
|
70
|
+
Total: [sum]
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Ghi Vào Plan
|
|
74
|
+
|
|
75
|
+
Cập nhật phần "Estimation Tổng" trong plan file.
|
|
76
|
+
|
|
77
|
+
## Trình Bày
|
|
78
|
+
|
|
79
|
+
```markdown
|
|
80
|
+
## Estimation Summary: $ARGUMENTS
|
|
81
|
+
|
|
82
|
+
| Subtask | Complexity | Uncertainty | Estimate |
|
|
83
|
+
|---------|-----------|-------------|---------|
|
|
84
|
+
| ST-1 | Low | Low | 2h |
|
|
85
|
+
| ST-2 | Medium | Medium | 6h |
|
|
86
|
+
|
|
87
|
+
**Total Estimate**: X hours (với buffer Y%)
|
|
88
|
+
**Confidence**: High / Medium / Low
|
|
89
|
+
**Risk note**: [nếu có unknowns lớn]
|
|
90
|
+
```
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dw-execute
|
|
3
|
+
description: "Thực hiện implementation theo plan đã được approve. Tuân thủ TDD, commit sau mỗi subtask. Chỉ dùng khi plan đã được duyệt."
|
|
4
|
+
argument-hint: "[task-name]"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Thực Hiện Implementation
|
|
8
|
+
|
|
9
|
+
Task: **$ARGUMENTS**
|
|
10
|
+
|
|
11
|
+
## Đọc Config
|
|
12
|
+
|
|
13
|
+
Đọc `.dw/config/dw.config.yml` → lấy:
|
|
14
|
+
- `paths.tasks` → location task docs
|
|
15
|
+
- `quality.test_command` → lệnh chạy tests (nếu có)
|
|
16
|
+
- `quality.lint_command` → lệnh chạy linter (nếu có)
|
|
17
|
+
- `quality.block_on_fail` → có block commit khi fail không
|
|
18
|
+
- `tracking.log_work` → ghi effort tracking không
|
|
19
|
+
- `workflow.default_depth` → `thorough` = cần docs-update, review bắt buộc
|
|
20
|
+
|
|
21
|
+
## Trước Khi Bắt Đầu
|
|
22
|
+
|
|
23
|
+
1. Đọc `{paths.tasks}/$ARGUMENTS/$ARGUMENTS-plan.md`
|
|
24
|
+
2. Đọc `{paths.tasks}/$ARGUMENTS/$ARGUMENTS-context.md`
|
|
25
|
+
3. Đọc `{paths.tasks}/$ARGUMENTS/$ARGUMENTS-progress.md`
|
|
26
|
+
4. Xác nhận plan có `Trạng thái: Approved`
|
|
27
|
+
|
|
28
|
+
Nếu plan chưa approved → **DỪNG**, yêu cầu approve trước.
|
|
29
|
+
Nếu chưa có plan → **DỪNG**, yêu cầu chạy `/dw-plan $ARGUMENTS`.
|
|
30
|
+
Nếu có progress → tiếp tục từ subtask cuối cùng chưa done.
|
|
31
|
+
|
|
32
|
+
## Quy Trình Cho MỖI Subtask
|
|
33
|
+
|
|
34
|
+
### Step 1: Chuẩn bị
|
|
35
|
+
- Đọc subtask từ plan (mô tả, files, criteria)
|
|
36
|
+
- Cập nhật progress: subtask → `in_progress`
|
|
37
|
+
|
|
38
|
+
### Step 2: Test First (TDD)
|
|
39
|
+
- Viết test cho subtask (nếu applicable)
|
|
40
|
+
- Chạy test → confirm FAIL (red)
|
|
41
|
+
- Nếu test đã pass → kiểm tra lại, có thể test sai
|
|
42
|
+
|
|
43
|
+
### Step 3: Implement
|
|
44
|
+
- Code theo spec trong plan
|
|
45
|
+
- Tuân thủ conventions trong `.claude/rules/code-style.md`
|
|
46
|
+
- KHÔNG thay đổi scope ngoài plan
|
|
47
|
+
|
|
48
|
+
### Step 4: Verify
|
|
49
|
+
- Chạy test → confirm PASS (green)
|
|
50
|
+
- Nếu `quality.lint_command` không rỗng: chạy linter
|
|
51
|
+
- Nếu `quality.block_on_fail = true` và fail → DỪNG, fix trước
|
|
52
|
+
- Nếu `quality.block_on_fail = false` → cảnh báo, cho phép tiếp tục
|
|
53
|
+
|
|
54
|
+
### Step 5: Cập nhật Progress
|
|
55
|
+
Cập nhật `{paths.tasks}/$ARGUMENTS/$ARGUMENTS-progress.md`:
|
|
56
|
+
```markdown
|
|
57
|
+
| ST-N | [Subtask name] | Done | abc1234 | [ghi chú] |
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Nếu `tracking.log_work = true`, ghi effort thực tế vào:
|
|
61
|
+
```markdown
|
|
62
|
+
### Effort Log
|
|
63
|
+
| Subtask | Estimate | Actual | Ghi chú |
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Step 6: Commit
|
|
67
|
+
```
|
|
68
|
+
<type>(<scope>): <mô tả subtask>
|
|
69
|
+
|
|
70
|
+
Subtask ST-N of $ARGUMENTS
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Khi Phát Hiện Vấn Đề
|
|
74
|
+
|
|
75
|
+
### Giả định sai / Scope thay đổi
|
|
76
|
+
1. **DỪNG** implementation ngay
|
|
77
|
+
2. Ghi vào progress → mục "Phát Hiện Mới"
|
|
78
|
+
3. Thông báo user: vấn đề gì, ảnh hưởng gì
|
|
79
|
+
4. Đề xuất: tiếp tục / cập nhật plan / thay đổi hướng
|
|
80
|
+
5. **CHỜ** quyết định từ user
|
|
81
|
+
|
|
82
|
+
### Test fail không rõ nguyên nhân
|
|
83
|
+
1. KHÔNG sửa test để pass (trừ khi test sai)
|
|
84
|
+
2. Chạy `/dw-debug` nếu cần
|
|
85
|
+
3. Ghi vào progress nếu mất thời gian
|
|
86
|
+
|
|
87
|
+
### Conflict với code khác
|
|
88
|
+
1. Ghi vào progress
|
|
89
|
+
2. Thông báo user
|
|
90
|
+
3. Đề xuất giải quyết
|
|
91
|
+
|
|
92
|
+
## Khi Hoàn Thành Tất Cả Subtasks
|
|
93
|
+
|
|
94
|
+
1. Cập nhật progress: Trạng thái → `Done`
|
|
95
|
+
2. Tóm tắt: subtasks completed, commits, issues encountered
|
|
96
|
+
3. Luôn gợi ý: "Tiếp theo: `/dw-review $ARGUMENTS`"
|
|
97
|
+
4. Nếu `workflow.default_depth = thorough`: "Cần chạy `/dw-docs-update $ARGUMENTS`"
|
|
98
|
+
5. Nếu `tracking.log_work = true`: Hiển thị estimate vs actual, gợi ý `/dw-log-work $ARGUMENTS`
|