dw-kit 1.0.2 → 1.1.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/rules/workflow-rules.md +15 -0
- package/.claude/skills/dw-onboard/SKILL.md +201 -0
- package/.claude/skills/dw-retroactive/SKILL.md +311 -0
- package/CLAUDE.md +12 -0
- package/README.md +1 -21
- package/package.json +7 -2
- package/src/commands/init.mjs +1 -1
- package/src/commands/prompt.mjs +2 -15
- package/.claude/settings.local.json +0 -13
|
@@ -12,6 +12,8 @@ Trước khi thực hiện bất kỳ skill nào, PHẢI đọc `.dw/config/dw.c
|
|
|
12
12
|
|
|
13
13
|
| Skill | Level 1 | Level 2 | Level 3 |
|
|
14
14
|
|-------|---------|---------|---------|
|
|
15
|
+
| onboard | yes | yes | yes |
|
|
16
|
+
| retroactive | yes | yes | yes |
|
|
15
17
|
| task-init | yes | yes | yes |
|
|
16
18
|
| research | yes | yes | yes |
|
|
17
19
|
| plan | skip | yes | yes |
|
|
@@ -43,6 +45,19 @@ Trước khi thực hiện bất kỳ skill nào, PHẢI đọc `.dw/config/dw.c
|
|
|
43
45
|
- Ghi rõ: đang ở subtask nào, blockers, context quan trọng
|
|
44
46
|
- Commit work-in-progress nếu có thay đổi đáng kể
|
|
45
47
|
|
|
48
|
+
## Adoption Workflow (Existing Project)
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
Lần đầu dùng dw trên project đang chạy:
|
|
52
|
+
/dw-onboard → .dw/context/project-map.md + module docs (breadth-first)
|
|
53
|
+
↓
|
|
54
|
+
Khi cần AI hiểu sâu module cụ thể:
|
|
55
|
+
/dw-retroactive [module] → .dw/tasks/[module]/ as-built docs (depth-first)
|
|
56
|
+
↓
|
|
57
|
+
Task mới liên quan module đã documented:
|
|
58
|
+
/dw-research [task] → AI đọc context có sẵn làm foundation
|
|
59
|
+
```
|
|
60
|
+
|
|
46
61
|
## Multi-Role Workflow
|
|
47
62
|
|
|
48
63
|
```
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dw-onboard
|
|
3
|
+
description: "Onboard dw-kit vào project đang chạy. Scan codebase, tạo project map và context docs cho các modules hiện có. Chạy một lần khi adopt dw vào existing project."
|
|
4
|
+
argument-hint: ""
|
|
5
|
+
allowed-tools:
|
|
6
|
+
- Read
|
|
7
|
+
- Grep
|
|
8
|
+
- Glob
|
|
9
|
+
- Write
|
|
10
|
+
- "Bash(git log *)"
|
|
11
|
+
- "Bash(git shortlog *)"
|
|
12
|
+
- "Bash(ls *)"
|
|
13
|
+
- "Bash(wc *)"
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# dw-onboard — Onboard Existing Project vào dw-kit
|
|
17
|
+
|
|
18
|
+
> Dùng khi adopt dw-kit vào project đã chạy. Chạy **một lần**. Output là project map và context docs cho các modules hiện có — làm nền tảng cho AI trong các sessions sau.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Đọc Config
|
|
23
|
+
|
|
24
|
+
Đọc `.dw/config/dw.config.yml`:
|
|
25
|
+
- `paths.tasks` → base tasks path
|
|
26
|
+
- `project.language` → ngôn ngữ output
|
|
27
|
+
- `project.name` → tên project
|
|
28
|
+
|
|
29
|
+
## Bước 1: Khám phá cấu trúc project
|
|
30
|
+
|
|
31
|
+
Scan top-level structure của codebase:
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
Glob: src/**, app/**, lib/**, packages/**, services/**, modules/**
|
|
35
|
+
Bash: ls -la (top level)
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Xác định:
|
|
39
|
+
- **Project type**: monorepo / single app / microservices / library
|
|
40
|
+
- **Tech stack**: ngôn ngữ, framework chính (từ package.json, go.mod, requirements.txt, Cargo.toml, v.v.)
|
|
41
|
+
- **Entry points**: main files, index files, routers
|
|
42
|
+
- **Major directories**: mỗi dir là 1 potential module
|
|
43
|
+
|
|
44
|
+
## Bước 2: Phân loại modules
|
|
45
|
+
|
|
46
|
+
Với mỗi major directory/module, xác định:
|
|
47
|
+
|
|
48
|
+
| Module | Type | Vai trò | Files | Phức tạp? |
|
|
49
|
+
|--------|------|---------|-------|-----------|
|
|
50
|
+
| [dir] | feature/service/util/infra | [mô tả 1 dòng] | [số files] | Cao/TB/Thấp |
|
|
51
|
+
|
|
52
|
+
**Phức tạp = Cao** nếu: nhiều files (>10), có DB/API, business logic phức tạp.
|
|
53
|
+
→ Modules phức tạp Cao: recommend `/dw-retroactive [module]` sau.
|
|
54
|
+
|
|
55
|
+
## Bước 3: Phân tích nhanh từng module
|
|
56
|
+
|
|
57
|
+
Với mỗi module (không cần đọc toàn bộ — chỉ đọc đủ để hiểu):
|
|
58
|
+
|
|
59
|
+
1. **Entry file**: đọc file chính (index, main, router, controller)
|
|
60
|
+
2. **Exports/Public API**: function/class/endpoint nào được expose?
|
|
61
|
+
3. **Dependencies**: module này gọi đến module nào khác?
|
|
62
|
+
4. **Git activity**: `git shortlog --since="6 months ago" -- [path]` → ai đang maintain?
|
|
63
|
+
|
|
64
|
+
Ghi tóm tắt ngắn gọn (3-5 dòng) per module.
|
|
65
|
+
|
|
66
|
+
## Bước 4: Check git history toàn project
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
git log --oneline --since="3 months ago" | head -30
|
|
70
|
+
git shortlog -sn --since="3 months ago" | head -10
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Xác định:
|
|
74
|
+
- Modules nào đang active development
|
|
75
|
+
- Modules nào stable / ít thay đổi
|
|
76
|
+
- Contributors chính
|
|
77
|
+
|
|
78
|
+
## Bước 5: Tạo output
|
|
79
|
+
|
|
80
|
+
### 5a. Project Map
|
|
81
|
+
|
|
82
|
+
Tạo `.dw/context/project-map.md`:
|
|
83
|
+
|
|
84
|
+
```markdown
|
|
85
|
+
# Project Map: [project.name]
|
|
86
|
+
|
|
87
|
+
## Ngày tạo: [date]
|
|
88
|
+
## Tạo bởi: dw-onboard
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Tech Stack
|
|
93
|
+
|
|
94
|
+
- **Ngôn ngữ**: [language]
|
|
95
|
+
- **Framework**: [framework]
|
|
96
|
+
- **Database**: [db nếu có]
|
|
97
|
+
- **Infrastructure**: [docker, k8s, cloud nếu có]
|
|
98
|
+
|
|
99
|
+
## Cấu Trúc Tổng Quan
|
|
100
|
+
|
|
101
|
+
```
|
|
102
|
+
[ASCII tree của top-level structure]
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Modules
|
|
106
|
+
|
|
107
|
+
| Module | Type | Vai trò | Phức tạp | Active? | Deep-dive? |
|
|
108
|
+
|--------|------|---------|----------|---------|------------|
|
|
109
|
+
| [name] | [type] | [mô tả ngắn] | Cao/TB/Thấp | Có/Không | `/dw-retroactive [name]` |
|
|
110
|
+
|
|
111
|
+
## Dependencies giữa Modules
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
[Module A] → [Module B] → [Module C]
|
|
115
|
+
↓
|
|
116
|
+
[Module D]
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Entry Points chính
|
|
120
|
+
|
|
121
|
+
- [file/endpoint]: [mô tả]
|
|
122
|
+
|
|
123
|
+
## Conventions phát hiện
|
|
124
|
+
|
|
125
|
+
- [Convention 1]: [mô tả]
|
|
126
|
+
- [Convention 2]
|
|
127
|
+
|
|
128
|
+
## Git Activity (3 tháng gần nhất)
|
|
129
|
+
|
|
130
|
+
- **Active modules**: [danh sách]
|
|
131
|
+
- **Stable modules**: [danh sách]
|
|
132
|
+
- **Top contributors**: [tên]
|
|
133
|
+
|
|
134
|
+
## Gợi ý Deep-dive
|
|
135
|
+
|
|
136
|
+
Các modules phức tạp nên chạy `/dw-retroactive` để AI có context đầy đủ:
|
|
137
|
+
- [ ] `/dw-retroactive [module-a]` — [lý do: nhiều files, core business logic]
|
|
138
|
+
- [ ] `/dw-retroactive [module-b]`
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### 5b. Module context docs
|
|
142
|
+
|
|
143
|
+
Với mỗi module **phức tạp Cao**: tạo `.dw/context/modules/[module-name].md`:
|
|
144
|
+
|
|
145
|
+
```markdown
|
|
146
|
+
# Module: [module-name]
|
|
147
|
+
|
|
148
|
+
## Vai trò
|
|
149
|
+
[1-2 câu mô tả]
|
|
150
|
+
|
|
151
|
+
## Files chính
|
|
152
|
+
| File | Vai trò |
|
|
153
|
+
|------|---------|
|
|
154
|
+
| [file] | [vai trò] |
|
|
155
|
+
|
|
156
|
+
## Public API / Exports
|
|
157
|
+
- [function/endpoint]: [mô tả]
|
|
158
|
+
|
|
159
|
+
## Dependencies
|
|
160
|
+
- Upstream: [modules gọi đến đây]
|
|
161
|
+
- Downstream: [modules được đây gọi]
|
|
162
|
+
|
|
163
|
+
## Conventions riêng
|
|
164
|
+
- [Convention đặc thù của module này]
|
|
165
|
+
|
|
166
|
+
## Lưu ý cho AI
|
|
167
|
+
- [Gotchas, tech debt, context quan trọng]
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
Với modules **phức tạp TB/Thấp**: chỉ ghi entry trong project-map.md, không tạo file riêng.
|
|
171
|
+
|
|
172
|
+
## Bước 6: Báo cáo kết quả
|
|
173
|
+
|
|
174
|
+
```
|
|
175
|
+
╔══════════════════════════════════════════════════════╗
|
|
176
|
+
║ ✅ dw-onboard complete: [project.name]
|
|
177
|
+
╠══════════════════════════════════════════════════════╣
|
|
178
|
+
║ Modules discovered : [N]
|
|
179
|
+
║ Docs tạo :
|
|
180
|
+
║ .dw/context/project-map.md
|
|
181
|
+
║ .dw/context/modules/[X files]
|
|
182
|
+
║ Tech stack : [summary]
|
|
183
|
+
╠══════════════════════════════════════════════════════╣
|
|
184
|
+
║ Gợi ý tiếp theo:
|
|
185
|
+
║ Modules phức tạp cần deep-dive:
|
|
186
|
+
║ → /dw-retroactive [module-a]
|
|
187
|
+
║ → /dw-retroactive [module-b]
|
|
188
|
+
║
|
|
189
|
+
║ Khi bắt đầu task mới liên quan module đã có:
|
|
190
|
+
║ → AI sẽ tự đọc .dw/context/ để có context
|
|
191
|
+
╚══════════════════════════════════════════════════════╝
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## Lưu ý
|
|
197
|
+
|
|
198
|
+
- **Không tạo `.dw/tasks/`** — onboard output vào `.dw/context/`, tách khỏi task docs
|
|
199
|
+
- **Không đọc toàn bộ code** — chỉ cần đủ để hiểu vai trò và interface của module
|
|
200
|
+
- **Không analyze chi tiết logic** — đó là việc của `/dw-retroactive` khi cần deep-dive
|
|
201
|
+
- Nếu project đã có `.dw/context/project-map.md` → hỏi user: "Đã có project map. Update hay skip?"
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dw-retroactive
|
|
3
|
+
description: "Retroactively document một feature/task đã được implement trước khi dùng dw. Reverse-engineer từ code + git history, tạo đầy đủ context + as-built plan + progress docs. Dùng khi cần AI hiểu sâu một module cũ."
|
|
4
|
+
argument-hint: "[feature-name]"
|
|
5
|
+
allowed-tools:
|
|
6
|
+
- Read
|
|
7
|
+
- Grep
|
|
8
|
+
- Glob
|
|
9
|
+
- Write
|
|
10
|
+
- "Bash(git log *)"
|
|
11
|
+
- "Bash(git diff *)"
|
|
12
|
+
- "Bash(git show *)"
|
|
13
|
+
- "Bash(git blame *)"
|
|
14
|
+
- "Bash(git shortlog *)"
|
|
15
|
+
- "Bash(ls *)"
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# dw-retroactive — Retroactive Documentation
|
|
19
|
+
|
|
20
|
+
Feature: **$ARGUMENTS**
|
|
21
|
+
|
|
22
|
+
> Reverse-engineer feature đã tồn tại từ code và git history. Tạo đầy đủ task docs như thể đã đi qua workflow dw — để AI (và team) có context đầy đủ khi làm việc liên quan feature này.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Đọc Config
|
|
27
|
+
|
|
28
|
+
Đọc `.dw/config/dw.config.yml`:
|
|
29
|
+
- `paths.tasks` → output location (mặc định `.dw/tasks`)
|
|
30
|
+
- `project.language` → ngôn ngữ docs
|
|
31
|
+
|
|
32
|
+
## Kiểm tra đã có docs chưa
|
|
33
|
+
|
|
34
|
+
Kiểm tra `{paths.tasks}/$ARGUMENTS/` đã tồn tại chưa:
|
|
35
|
+
- Nếu rồi → hỏi user: "Đã có task docs cho `$ARGUMENTS`. Overwrite hay skip?"
|
|
36
|
+
- Nếu chưa → tiếp tục
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Bước 1: Tìm files liên quan
|
|
41
|
+
|
|
42
|
+
Dùng tên `$ARGUMENTS` như keyword để tìm:
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
Glob: **/*$ARGUMENTS*
|
|
46
|
+
Grep: "$ARGUMENTS" trong toàn codebase (case-insensitive)
|
|
47
|
+
Grep: tên function/class/route liên quan (nếu có thể suy ra từ tên)
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Nếu không tìm được → hỏi user: "Không tìm thấy files liên quan `$ARGUMENTS`. Bạn có thể cung cấp thêm keyword hoặc path không?"
|
|
51
|
+
|
|
52
|
+
## Bước 2: Đọc và phân tích code
|
|
53
|
+
|
|
54
|
+
Với mỗi file tìm được:
|
|
55
|
+
|
|
56
|
+
1. **Đọc toàn bộ file** (hoặc phần liên quan)
|
|
57
|
+
2. Xác định:
|
|
58
|
+
- Vai trò của file trong feature này
|
|
59
|
+
- Logic chính / business rules
|
|
60
|
+
- Input/Output/Side effects
|
|
61
|
+
- Error handling patterns
|
|
62
|
+
3. **Trace data flow**: đầu vào từ đâu → xử lý gì → kết quả đi đâu
|
|
63
|
+
4. **Tìm dependencies**: module này gọi gì? Ai gọi module này?
|
|
64
|
+
5. **Tìm tests**: test files liên quan, coverage hiện tại
|
|
65
|
+
|
|
66
|
+
## Bước 3: Phân tích git history
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
# Commits liên quan feature
|
|
70
|
+
git log --oneline --follow -- [files-found]
|
|
71
|
+
|
|
72
|
+
# Ai đã implement
|
|
73
|
+
git shortlog -sn -- [files-found]
|
|
74
|
+
|
|
75
|
+
# Thay đổi đáng kể
|
|
76
|
+
git log --oneline --diff-filter=A -- [files-found] # khi files được tạo
|
|
77
|
+
|
|
78
|
+
# Context của lần commit đầu tiên
|
|
79
|
+
git show [first-commit] --stat
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Xác định:
|
|
83
|
+
- Feature được tạo khi nào
|
|
84
|
+
- Ai implement (để biết ai có thể được hỏi)
|
|
85
|
+
- Có breaking changes nào đã được fix sau đó không
|
|
86
|
+
- Tech debt nào đang tồn tại (TODO, FIXME trong code)
|
|
87
|
+
|
|
88
|
+
## Bước 4: Áp dụng tư duy phản biện
|
|
89
|
+
|
|
90
|
+
Từ framework `core/THINKING.md` (hoặc `.claude/skills/dw-thinking/THINKING.md`):
|
|
91
|
+
|
|
92
|
+
- **Giả định**: Code đang giả định gì về input, state, environment?
|
|
93
|
+
- **Failure modes**: Điều gì có thể làm feature này fail? Edge cases nào?
|
|
94
|
+
- **Tech debt**: Có TODO/FIXME? Có antipatterns? Code mùi?
|
|
95
|
+
- **Security**: Có điểm nào đáng lo ngại về auth, validation, data exposure?
|
|
96
|
+
|
|
97
|
+
## Bước 5: Tạo task docs
|
|
98
|
+
|
|
99
|
+
Tạo thư mục `{paths.tasks}/$ARGUMENTS/` và 3 files:
|
|
100
|
+
|
|
101
|
+
### 5a. Context doc
|
|
102
|
+
|
|
103
|
+
Tạo `{paths.tasks}/$ARGUMENTS/$ARGUMENTS-context.md`:
|
|
104
|
+
|
|
105
|
+
```markdown
|
|
106
|
+
# Context: $ARGUMENTS
|
|
107
|
+
|
|
108
|
+
## Ngày khảo sát: [date]
|
|
109
|
+
## Loại: Retroactive Documentation
|
|
110
|
+
## Người thực hiện: agent (dw-retroactive)
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Mô Tả Feature
|
|
115
|
+
|
|
116
|
+
[2-3 câu mô tả feature làm gì, phục vụ ai]
|
|
117
|
+
|
|
118
|
+
## Codebase Analysis
|
|
119
|
+
|
|
120
|
+
### Files Liên Quan
|
|
121
|
+
|
|
122
|
+
| # | File | Vai trò | Ghi chú |
|
|
123
|
+
|---|------|---------|---------|
|
|
124
|
+
| 1 | [file] | [vai trò] | |
|
|
125
|
+
|
|
126
|
+
### Kiến Trúc
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
[ASCII diagram hoặc mô tả luồng]
|
|
130
|
+
Input → [Module] → Output
|
|
131
|
+
↓
|
|
132
|
+
[Dependencies]
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Data Flow
|
|
136
|
+
|
|
137
|
+
- **Input**: [từ đâu, format gì]
|
|
138
|
+
- **Processing**: [logic chính]
|
|
139
|
+
- **Output**: [đi đâu, format gì]
|
|
140
|
+
- **Side effects**: [DB writes, events, external calls]
|
|
141
|
+
|
|
142
|
+
## Dependencies
|
|
143
|
+
|
|
144
|
+
### Upstream (feature phụ thuộc vào)
|
|
145
|
+
- [ ] [Module/Service] — [vai trò]
|
|
146
|
+
|
|
147
|
+
### Downstream (ai phụ thuộc vào feature này)
|
|
148
|
+
- [ ] [Module/Service] — [ảnh hưởng thế nào]
|
|
149
|
+
|
|
150
|
+
## Git History
|
|
151
|
+
|
|
152
|
+
- **Tạo lần đầu**: [date] bởi [author]
|
|
153
|
+
- **Commits**: [N commits]
|
|
154
|
+
- **Maintainer chính**: [author]
|
|
155
|
+
- **Thay đổi đáng kể**: [mô tả nếu có]
|
|
156
|
+
|
|
157
|
+
## Test Coverage
|
|
158
|
+
|
|
159
|
+
- [ ] Có tests: [Có/Không]
|
|
160
|
+
- Test files: [danh sách]
|
|
161
|
+
- Coverage: [mô tả]
|
|
162
|
+
- Gaps: [thiếu test ở đâu]
|
|
163
|
+
|
|
164
|
+
## Giả Định & Hạn Chế
|
|
165
|
+
|
|
166
|
+
| # | Giả định/Hạn chế | Mức độ rủi ro |
|
|
167
|
+
|---|-----------------|--------------|
|
|
168
|
+
| 1 | [giả định trong code] | Cao/TB/Thấp |
|
|
169
|
+
|
|
170
|
+
## Tech Debt & Warnings
|
|
171
|
+
|
|
172
|
+
- [ ] [TODO/FIXME đang có]
|
|
173
|
+
- [ ] [Antipatterns phát hiện]
|
|
174
|
+
- [ ] [Security concerns]
|
|
175
|
+
|
|
176
|
+
## Ghi Chú Cho AI
|
|
177
|
+
|
|
178
|
+
> Context quan trọng khi làm task liên quan feature này:
|
|
179
|
+
- [Gotcha 1]
|
|
180
|
+
- [Gotcha 2]
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### 5b. As-Built Plan doc
|
|
184
|
+
|
|
185
|
+
Tạo `{paths.tasks}/$ARGUMENTS/$ARGUMENTS-plan.md`:
|
|
186
|
+
|
|
187
|
+
```markdown
|
|
188
|
+
# As-Built Plan: $ARGUMENTS
|
|
189
|
+
|
|
190
|
+
## Ngày tạo: [date]
|
|
191
|
+
## Loại: As-Built (Retroactive) — không phải forward plan
|
|
192
|
+
## Trạng thái: Done (implemented trước khi adopt dw)
|
|
193
|
+
## Implemented by: [author từ git history]
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
> ⚠ Đây là tài liệu retroactive — mô tả những gì ĐÃ được implement,
|
|
198
|
+
> không phải plan cho việc sẽ làm. Dùng để AI và team hiểu context.
|
|
199
|
+
|
|
200
|
+
## Tóm Tắt Giải Pháp Đã Implement
|
|
201
|
+
|
|
202
|
+
[Mô tả approach được dùng, dựa trên code analysis]
|
|
203
|
+
|
|
204
|
+
## Những Gì Đã Implement
|
|
205
|
+
|
|
206
|
+
### Component 1: [Tên]
|
|
207
|
+
- **Mô tả**: [làm gì]
|
|
208
|
+
- **Files**: [danh sách]
|
|
209
|
+
- **Cách hoạt động**: [tóm tắt logic]
|
|
210
|
+
|
|
211
|
+
### Component 2: [Tên]
|
|
212
|
+
...
|
|
213
|
+
|
|
214
|
+
## Quyết Định Kỹ Thuật Đáng Chú Ý
|
|
215
|
+
|
|
216
|
+
| Quyết định | Approach đã dùng | Lý do suy đoán |
|
|
217
|
+
|-----------|-----------------|----------------|
|
|
218
|
+
| [decision] | [approach] | [inferred from code/commits] |
|
|
219
|
+
|
|
220
|
+
## Rủi Ro & Hạn Chế Đã Biết
|
|
221
|
+
|
|
222
|
+
| # | Mô tả | Mức độ | Trạng thái |
|
|
223
|
+
|---|-------|--------|-----------|
|
|
224
|
+
| 1 | [risk] | Cao/TB/Thấp | Open/Resolved |
|
|
225
|
+
|
|
226
|
+
## Edge Cases
|
|
227
|
+
|
|
228
|
+
- [ ] [Edge case được xử lý hay chưa?]
|
|
229
|
+
|
|
230
|
+
## Tác Động Hệ Thống
|
|
231
|
+
|
|
232
|
+
- **Modules ảnh hưởng**: [danh sách]
|
|
233
|
+
- **API**: [endpoints liên quan]
|
|
234
|
+
- **Database**: [schema/tables liên quan]
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### 5c. Progress doc
|
|
238
|
+
|
|
239
|
+
Tạo `{paths.tasks}/$ARGUMENTS/$ARGUMENTS-progress.md`:
|
|
240
|
+
|
|
241
|
+
```markdown
|
|
242
|
+
# Progress: $ARGUMENTS
|
|
243
|
+
|
|
244
|
+
## Trạng thái: Done (Pre-dw Implementation)
|
|
245
|
+
## Loại: Retroactive Documentation
|
|
246
|
+
## Documented on: [date]
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
> Feature này đã được implement trước khi adopt dw-kit.
|
|
251
|
+
> File này được tạo retroactively để AI có context khi làm task liên quan.
|
|
252
|
+
|
|
253
|
+
## Implementation History (từ git)
|
|
254
|
+
|
|
255
|
+
| Thời điểm | Sự kiện | Author |
|
|
256
|
+
|-----------|---------|--------|
|
|
257
|
+
| [date] | Feature được tạo | [author] |
|
|
258
|
+
| [date] | [notable change] | [author] |
|
|
259
|
+
|
|
260
|
+
## Known Issues / Open Items
|
|
261
|
+
|
|
262
|
+
- [ ] [Issue đang mở nếu có]
|
|
263
|
+
- [ ] [Tech debt cần xử lý]
|
|
264
|
+
|
|
265
|
+
## Handoff Notes cho AI
|
|
266
|
+
|
|
267
|
+
Khi làm task liên quan feature này:
|
|
268
|
+
- **Đọc trước**: `$ARGUMENTS-context.md` để hiểu architecture
|
|
269
|
+
- **Cẩn thận**: [warning 1]
|
|
270
|
+
- **Không thay đổi**: [phần nào là stable contract]
|
|
271
|
+
- **Có thể refactor**: [phần nào an toàn để thay đổi]
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
## Bước 6: Báo cáo kết quả
|
|
277
|
+
|
|
278
|
+
```
|
|
279
|
+
╔══════════════════════════════════════════════════════╗
|
|
280
|
+
║ ✅ dw-retroactive complete: $ARGUMENTS
|
|
281
|
+
╠══════════════════════════════════════════════════════╣
|
|
282
|
+
║ Files khảo sát : [N files]
|
|
283
|
+
║ Git commits : [N commits, từ [date] đến [date]]
|
|
284
|
+
║ Maintainer chính : [author]
|
|
285
|
+
╠══════════════════════════════════════════════════════╣
|
|
286
|
+
║ Docs đã tạo:
|
|
287
|
+
║ {paths.tasks}/$ARGUMENTS/$ARGUMENTS-context.md
|
|
288
|
+
║ {paths.tasks}/$ARGUMENTS/$ARGUMENTS-plan.md (as-built)
|
|
289
|
+
║ {paths.tasks}/$ARGUMENTS/$ARGUMENTS-progress.md
|
|
290
|
+
╠══════════════════════════════════════════════════════╣
|
|
291
|
+
║ Key findings:
|
|
292
|
+
║ • [Finding 1]
|
|
293
|
+
║ • [Finding 2]
|
|
294
|
+
║ • [Finding 3]
|
|
295
|
+
╠══════════════════════════════════════════════════════╣
|
|
296
|
+
║ Tech debt / warnings:
|
|
297
|
+
║ • [Warning nếu có]
|
|
298
|
+
╠══════════════════════════════════════════════════════╣
|
|
299
|
+
║ Tiếp theo:
|
|
300
|
+
║ → Khi cần task liên quan: /dw-research $ARGUMENTS
|
|
301
|
+
║ (AI sẽ đọc context docs vừa tạo làm foundation)
|
|
302
|
+
╚══════════════════════════════════════════════════════╝
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
## Lưu ý
|
|
308
|
+
|
|
309
|
+
- **As-built ≠ forward plan**: Docs này mô tả hiện trạng, không phải kế hoạch
|
|
310
|
+
- **Best-effort**: AI chỉ thấy được những gì có trong code và git — context ẩn (verbal decisions, Slack threads) có thể thiếu. Cần human review và bổ sung.
|
|
311
|
+
- **Sau khi tạo**: Khuyến khích dev liên quan review và bổ sung `## Ghi Chú Cho AI` section
|
package/CLAUDE.md
CHANGED
|
@@ -6,6 +6,16 @@ Methodology: `core/WORKFLOW.md` (load on demand — không phải always-loaded)
|
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
+
## Override
|
|
10
|
+
|
|
11
|
+
Nếu prompt của user chứa `--no-dw`:
|
|
12
|
+
- Bỏ qua **toàn bộ** dw workflow instructions (Quy Tắc Vàng, Routing, Session Start)
|
|
13
|
+
- KHÔNG đọc config, KHÔNG check tasks, KHÔNG apply thinking framework
|
|
14
|
+
- Làm việc như Claude thông thường — trả lời trực tiếp, không theo process nào
|
|
15
|
+
- Áp dụng cho request đó; request tiếp theo vẫn dùng dw bình thường
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
9
19
|
## Quy Tắc Vàng
|
|
10
20
|
|
|
11
21
|
1. **Config-driven**: Đọc `.dw/config/dw.config.yml` trước mọi action
|
|
@@ -60,6 +70,8 @@ Không chắc scope → dùng `standard`. Assess dựa trên facts (file count,
|
|
|
60
70
|
| `/dw-dashboard` | PM: metrics report | if pm role |
|
|
61
71
|
| `/dw-sprint-review` | Team retrospective | all |
|
|
62
72
|
| `/dw-docs-update` | Cập nhật living docs | thorough |
|
|
73
|
+
| `/dw-onboard` | Onboard dw vào existing project (breadth-first scan) | always |
|
|
74
|
+
| `/dw-retroactive [name]` | Retroactive doc 1 feature đã có (depth-first) | always |
|
|
63
75
|
| `/dw-config-init` | Khởi tạo config mới | always |
|
|
64
76
|
| `/dw-config-validate` | Validate config file | always |
|
|
65
77
|
| `/dw-upgrade` | Upgrade toolkit | always |
|
package/README.md
CHANGED
|
@@ -14,27 +14,7 @@ dw-kit helps your team run AI-assisted development with a **repeatable workflow*
|
|
|
14
14
|
Initialize → Understand → Plan → Execute (TDD) → Verify → Close
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
%%{init: {'flowchart': {'nodeSpacing': 10, 'rankSpacing': 18}}}%%
|
|
19
|
-
flowchart LR
|
|
20
|
-
classDef extra fill:#f3f4f6,stroke:#9ca3af,stroke-width:1px,color:#111;
|
|
21
|
-
|
|
22
|
-
D["Init + Understand"] --> P["Plan (approve)"]
|
|
23
|
-
P -->|approved| E["Execute (TDD)"]
|
|
24
|
-
P -->|revise| P
|
|
25
|
-
|
|
26
|
-
E --> V["Verify (gates)"]
|
|
27
|
-
V -->|sign-off| C["Close (handoff + archive)"]
|
|
28
|
-
V -->|"revise (fix)"| E
|
|
29
|
-
|
|
30
|
-
subgraph Extra["Depth=thorough"]
|
|
31
|
-
R[Req] --> Est[Est] --> AR[Arch] --> P
|
|
32
|
-
P -.-> TP[Test] -.-> E
|
|
33
|
-
E -.-> DU[Docs] --> LW[Log] -.-> C
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
class R,Est,AR,TP,DU,LW extra
|
|
37
|
-
```
|
|
17
|
+
<img src="docs/workflow-diagram.svg" alt="dw-kit workflow diagram" />
|
|
38
18
|
|
|
39
19
|
## Workflow overview
|
|
40
20
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dw-kit",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "AI development workflow toolkit — structured, quality-assured, team-ready. From requirements to dashboard.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -13,7 +13,12 @@
|
|
|
13
13
|
".dw/config/",
|
|
14
14
|
".dw/adapters/",
|
|
15
15
|
"scripts/",
|
|
16
|
-
".claude/",
|
|
16
|
+
".claude/agents/",
|
|
17
|
+
".claude/hooks/",
|
|
18
|
+
".claude/rules/",
|
|
19
|
+
".claude/skills/",
|
|
20
|
+
".claude/templates/",
|
|
21
|
+
".claude/settings.json",
|
|
17
22
|
"CLAUDE.md"
|
|
18
23
|
],
|
|
19
24
|
"engines": {
|
package/src/commands/init.mjs
CHANGED
|
@@ -276,7 +276,7 @@ function createRuntimeDirs(projectDir) {
|
|
|
276
276
|
|
|
277
277
|
function updateGitignore(projectDir) {
|
|
278
278
|
const gitignorePath = join(projectDir, '.gitignore');
|
|
279
|
-
const entriesToAdd = ['.
|
|
279
|
+
const entriesToAdd = ['CLAUDE.local.md', '.claude/settings.local.json'];
|
|
280
280
|
|
|
281
281
|
if (existsSync(gitignorePath)) {
|
|
282
282
|
const content = readFileSync(gitignorePath, 'utf-8');
|
package/src/commands/prompt.mjs
CHANGED
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import { load as yamlLoad } from 'js-yaml';
|
|
4
1
|
import { header, info, ok, warn, err, log } from '../lib/ui.mjs';
|
|
5
2
|
import { copyToClipboard } from '../lib/clipboard.mjs';
|
|
6
3
|
import { getSuggestions, isVague, expandTemplate } from '../lib/prompt-suggest.mjs';
|
|
4
|
+
import { detectPlatform } from '../lib/platform.mjs';
|
|
7
5
|
|
|
8
6
|
export async function promptCommand(opts) {
|
|
9
7
|
header('dw-kit Prompt Builder');
|
|
10
8
|
|
|
11
|
-
const adapter =
|
|
9
|
+
const adapter = detectPlatform(process.cwd());
|
|
12
10
|
|
|
13
11
|
// Non-interactive mode: --text <text>
|
|
14
12
|
if (opts.text !== undefined) {
|
|
@@ -112,14 +110,3 @@ function outputResult(text, adapter) {
|
|
|
112
110
|
info('(generic adapter — copy the text above manually)');
|
|
113
111
|
}
|
|
114
112
|
}
|
|
115
|
-
|
|
116
|
-
function readAdapter() {
|
|
117
|
-
const configPath = join(process.cwd(), '.dw', 'config', 'dw.config.yml');
|
|
118
|
-
if (!existsSync(configPath)) return 'claude-cli';
|
|
119
|
-
try {
|
|
120
|
-
const config = yamlLoad(readFileSync(configPath, 'utf-8'));
|
|
121
|
-
return config?.adapter || 'claude-cli';
|
|
122
|
-
} catch {
|
|
123
|
-
return 'claude-cli';
|
|
124
|
-
}
|
|
125
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"permissions": {
|
|
3
|
-
"allow": [
|
|
4
|
-
"WebFetch(domain:alexop.dev)",
|
|
5
|
-
"WebFetch(domain:github.com)",
|
|
6
|
-
"WebFetch(domain:docs.anthropic.com)",
|
|
7
|
-
"Bash(grep -rL \"^name:\" .claude/skills/dw-*/SKILL.md)",
|
|
8
|
-
"Bash(grep -c '\\\\$ARGUMENTS\\\\|context: fork\\\\|allowed-tools' .dw/adapters/generic/AGENT.md)",
|
|
9
|
-
"Bash(grep [v1.0.0] CHANGELOG.md)",
|
|
10
|
-
"Bash(node src/smoke-test.mjs)"
|
|
11
|
-
]
|
|
12
|
-
}
|
|
13
|
-
}
|