@haposoft/cafekit 0.3.2 → 0.3.5
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/bin/install.js +1 -0
- package/package.json +1 -1
- package/src/antigravity/workflows/impact-analysis-output-example.md +313 -0
- package/src/antigravity/workflows/impact-analysis.md +735 -0
- package/src/claude/migration-manifest.json +2 -1
- package/src/common/skills/impact-analysis/SKILL.md +271 -0
- package/src/common/skills/impact-analysis/references/change-detection.md +270 -0
- package/src/common/skills/impact-analysis/references/dependency-scouting.md +337 -0
- package/src/common/skills/impact-analysis/references/edge-case-identification.md +439 -0
- package/src/common/skills/impact-analysis/references/industry-techniques.md +695 -0
- package/src/common/skills/impact-analysis/references/practical-techniques-guide.md +753 -0
- package/src/common/skills/impact-analysis/references/project-detection.md +704 -0
- package/src/common/skills/impact-analysis/references/react-native-customization.md +508 -0
- package/src/common/skills/impact-analysis/references/report-template.md +604 -0
- package/src/common/skills/impact-analysis/references/test-scenario-generation.md +459 -0
- package/src/common/skills/impact-analysis/scripts/README.md +476 -0
- package/src/common/skills/impact-analysis/scripts/ast-analyze.js +403 -0
- package/src/common/skills/impact-analysis/scripts/calculate-risk.js +475 -0
- package/src/common/skills/impact-analysis/scripts/find-dependencies.sh +202 -0
- package/src/common/skills/impact-analysis/scripts/run-analysis.sh +312 -0
package/bin/install.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@haposoft/cafekit",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.5",
|
|
4
4
|
"description": "Spec-Driven Development workflow for AI coding assistants. Supports Claude Code and Antigravity with spec-first and code-test-review workflows.",
|
|
5
5
|
"author": "Haposoft <nghialt@haposoft.com>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
# Ví Dụ Output: Phân Tích Impact - Thêm Xác Thực Sinh Trắc Học
|
|
2
|
+
|
|
3
|
+
> Đây là ví dụ output mẫu từ workflow Impact Analysis cho một thay đổi code thực tế.
|
|
4
|
+
>
|
|
5
|
+
> **Thay đổi**: Thêm tính năng xác thực sinh trắc học (Face ID/Touch ID) vào app React Native
|
|
6
|
+
>
|
|
7
|
+
> **Files thay đổi**: 5 files (auth service, login screen, biometric helper, profile settings, token storage)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 📋 Tóm Tắt Nhanh
|
|
12
|
+
|
|
13
|
+
**Mức độ rủi ro**: CAO ⚠️⚠️⚠️
|
|
14
|
+
|
|
15
|
+
**Tác động chính**:
|
|
16
|
+
- 🆕 Tính năng mới: Đăng nhập bằng Face ID/Touch ID
|
|
17
|
+
- ⚠️ Breaking change: Format lưu token đã thay đổi
|
|
18
|
+
- 🔄 Migration cần thiết: User hiện tại có thể phải đăng nhập lại
|
|
19
|
+
|
|
20
|
+
**Thời gian ước tính**:
|
|
21
|
+
- Sửa bugs: ~2 giờ
|
|
22
|
+
- Testing: ~45 phút
|
|
23
|
+
- Production-ready: 3-4 giờ
|
|
24
|
+
|
|
25
|
+
**Vấn đề nghiêm trọng**: 3 bugs cần sửa trước khi deploy
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 🎯 Tính Năng Bị Ảnh Hưởng
|
|
30
|
+
|
|
31
|
+
### 1. Đăng Nhập (NGHIÊM TRỌNG) ⚠️⚠️⚠️
|
|
32
|
+
|
|
33
|
+
**Hành động người dùng:**
|
|
34
|
+
- ✓ Đăng nhập email/password (vẫn hoạt động)
|
|
35
|
+
- 🆕 Đăng nhập bằng Face ID/Touch ID (tính năng mới)
|
|
36
|
+
- ⚠️ Phiên hiện tại có thể bị mất (breaking change)
|
|
37
|
+
|
|
38
|
+
**Tác động:**
|
|
39
|
+
Thêm option đăng nhập bằng sinh trắc học. Đăng nhập email/password vẫn hoạt động nhưng cách lưu token đã thay đổi, có thể làm mất phiên hiện tại. User có thể phải đăng nhập lại sau khi update.
|
|
40
|
+
|
|
41
|
+
**Người dùng sẽ thấy:**
|
|
42
|
+
- Nút "Đăng nhập bằng Face ID" mới trên màn hình login
|
|
43
|
+
- Prompt sinh trắc học khi tap nút
|
|
44
|
+
- Đăng nhập nhanh hơn (không cần gõ password)
|
|
45
|
+
- Có thể phải đăng nhập lại sau update app
|
|
46
|
+
|
|
47
|
+
**Breaking changes:**
|
|
48
|
+
- Format lưu token đã thay đổi
|
|
49
|
+
- Phiên hiện tại có thể bị vô hiệu
|
|
50
|
+
- User cần bật lại sinh trắc học sau update
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
### 2. Hồ Sơ Người Dùng (TRUNG BÌNH) ⚠️
|
|
55
|
+
|
|
56
|
+
**Hành động người dùng:**
|
|
57
|
+
- ✓ Xem hồ sơ (không đổi)
|
|
58
|
+
- ✓ Sửa hồ sơ (không đổi)
|
|
59
|
+
- 🆕 Bật/Tắt sinh trắc học (setting mới)
|
|
60
|
+
|
|
61
|
+
**Tác động:**
|
|
62
|
+
Thêm setting mới để bật/tắt xác thực sinh trắc học trong cài đặt hồ sơ.
|
|
63
|
+
|
|
64
|
+
**Người dùng sẽ thấy:**
|
|
65
|
+
- Toggle mới trong Settings: "Đăng nhập bằng sinh trắc học"
|
|
66
|
+
- Prompt xin permission khi bật lần đầu
|
|
67
|
+
- Có thể tắt bất cứ lúc nào
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## 🎬 Scenarios Người Dùng
|
|
72
|
+
|
|
73
|
+
### Scenario 1: Đăng Nhập Bằng Face ID (Flow Mới)
|
|
74
|
+
**Khi người dùng:**
|
|
75
|
+
1. Mở app
|
|
76
|
+
2. Tap nút "Đăng nhập bằng Face ID"
|
|
77
|
+
3. Nhìn vào camera (Face ID) hoặc đặt ngón tay (Touch ID)
|
|
78
|
+
|
|
79
|
+
**Sẽ thấy:**
|
|
80
|
+
- iOS: Prompt Face ID xuất hiện
|
|
81
|
+
- Android: Prompt vân tay xuất hiện
|
|
82
|
+
- Xác thực thành công → Đăng nhập
|
|
83
|
+
- Xác thực thất bại → Hiện lỗi, cho thử lại hoặc dùng password
|
|
84
|
+
|
|
85
|
+
**Cần test:** NGHIÊM TRỌNG ⚠️⚠️⚠️
|
|
86
|
+
- Test trên cả iOS và Android
|
|
87
|
+
- Test khi thành công
|
|
88
|
+
- Test khi thất bại
|
|
89
|
+
- Test khi chưa đăng ký sinh trắc học
|
|
90
|
+
- Test khi từ chối permission
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
### Scenario 2: User Hiện Tại Mở App Sau Update
|
|
95
|
+
**Khi người dùng:**
|
|
96
|
+
1. Đã đăng nhập trên app cũ
|
|
97
|
+
2. Update lên version mới (có sinh trắc học)
|
|
98
|
+
3. Mở app
|
|
99
|
+
|
|
100
|
+
**Có thể thấy:**
|
|
101
|
+
- Phiên bị mất → Phải đăng nhập lại
|
|
102
|
+
- Hoặc: Phiên vẫn còn → Thấy option sinh trắc học mới
|
|
103
|
+
|
|
104
|
+
**Cần test:** NGHIÊM TRỌNG ⚠️⚠️⚠️
|
|
105
|
+
- Test migration phiên
|
|
106
|
+
- Test user không bị logout
|
|
107
|
+
- Test hiển thị option mới
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
### Scenario 3: Bật Sinh Trắc Học Trong Settings
|
|
112
|
+
**Khi người dùng:**
|
|
113
|
+
1. Vào Profile > Settings
|
|
114
|
+
2. Tap toggle "Đăng nhập bằng sinh trắc học"
|
|
115
|
+
|
|
116
|
+
**Sẽ thấy:**
|
|
117
|
+
- iOS: Prompt xin permission (nếu chưa cho)
|
|
118
|
+
- Android: Kiểm tra đã đăng ký vân tay chưa
|
|
119
|
+
- Thành công: Sinh trắc học được bật
|
|
120
|
+
- Thất bại: Hiện lỗi rõ ràng
|
|
121
|
+
|
|
122
|
+
**Cần test:** QUAN TRỌNG ⚠️
|
|
123
|
+
- Test permission flow
|
|
124
|
+
- Test khi chưa đăng ký sinh trắc học
|
|
125
|
+
- Test khi từ chối permission
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
### Scenario 4: Sinh Trắc Học Thất Bại
|
|
130
|
+
**Khi người dùng:**
|
|
131
|
+
1. Tap "Đăng nhập bằng Face ID"
|
|
132
|
+
2. Xác thực thất bại (sai mặt/ngón tay)
|
|
133
|
+
|
|
134
|
+
**Sẽ thấy:**
|
|
135
|
+
- Thông báo lỗi
|
|
136
|
+
- Option "Thử lại" hoặc "Dùng Password"
|
|
137
|
+
- Không bị kẹt màn hình
|
|
138
|
+
|
|
139
|
+
**Cần test:** QUAN TRỌNG ⚠️
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
### Scenario 5: Thiết Bị Không Hỗ Trợ
|
|
144
|
+
**Khi người dùng:**
|
|
145
|
+
1. Mở app trên thiết bị không có sinh trắc học
|
|
146
|
+
|
|
147
|
+
**Sẽ thấy:**
|
|
148
|
+
- Nút sinh trắc học bị ẩn
|
|
149
|
+
- Chỉ có option đăng nhập password
|
|
150
|
+
- Thông báo: "Bật Face ID trong Settings để dùng tính năng này"
|
|
151
|
+
|
|
152
|
+
**Cần test:** BÌNH THƯỜNG
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## ⚠️ Vấn Đề Cần Sửa
|
|
157
|
+
|
|
158
|
+
### Nghiêm Trọng (3)
|
|
159
|
+
|
|
160
|
+
**1. iOS Chưa Xin Permission Đúng Cách**
|
|
161
|
+
- **Vị trí**: `src/utils/biometric/biometricHelper.ts:45`
|
|
162
|
+
- **Vấn đề**: iOS cần xin permission trong Info.plist và runtime, nhưng code chỉ check availability
|
|
163
|
+
- **Tác động**: Sinh trắc học sẽ fail trên iOS với lỗi "Permission denied"
|
|
164
|
+
- **Cách sửa**: Thêm flow xin permission cho iOS
|
|
165
|
+
|
|
166
|
+
```typescript
|
|
167
|
+
// Sửa:
|
|
168
|
+
if (Platform.OS === 'ios') {
|
|
169
|
+
const permission = await Biometrics.requestPermission();
|
|
170
|
+
if (permission !== 'granted') {
|
|
171
|
+
throw new Error('Cần cấp quyền sinh trắc học');
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
**2. Thiếu Migration Token Storage**
|
|
179
|
+
- **Vị trí**: `src/services/auth/authService.ts:89`
|
|
180
|
+
- **Vấn đề**: Format lưu token đã đổi từ plain sang encrypted, nhưng không có logic migration
|
|
181
|
+
- **Tác động**: User hiện tại sẽ bị logout sau update
|
|
182
|
+
- **Cách sửa**: Thêm logic migration khi app start
|
|
183
|
+
|
|
184
|
+
```typescript
|
|
185
|
+
// Thêm migration:
|
|
186
|
+
async function migrateTokenStorage() {
|
|
187
|
+
const oldToken = await AsyncStorage.getItem('auth_token');
|
|
188
|
+
if (oldToken && !await SecureStore.getItemAsync('auth_token_encrypted')) {
|
|
189
|
+
await SecureStore.setItemAsync('auth_token_encrypted', oldToken);
|
|
190
|
+
await AsyncStorage.removeItem('auth_token');
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
**3. Không Có Fallback Khi Sinh Trắc Học Thất Bại**
|
|
198
|
+
- **Vị trí**: `src/screens/Auth/LoginScreen.tsx:123`
|
|
199
|
+
- **Vấn đề**: Nếu sinh trắc học fail, không có option dùng password
|
|
200
|
+
- **Tác động**: User bị kẹt màn hình login
|
|
201
|
+
- **Cách sửa**: Thêm nút "Dùng Password" sau khi fail
|
|
202
|
+
|
|
203
|
+
```typescript
|
|
204
|
+
// Thêm fallback:
|
|
205
|
+
try {
|
|
206
|
+
await authenticateWithBiometric();
|
|
207
|
+
} catch (error) {
|
|
208
|
+
Alert.alert(
|
|
209
|
+
'Sinh trắc học thất bại',
|
|
210
|
+
'Bạn muốn dùng password thay thế?',
|
|
211
|
+
[
|
|
212
|
+
{ text: 'Thử lại', onPress: () => retry() },
|
|
213
|
+
{ text: 'Dùng Password', onPress: () => showPasswordLogin() }
|
|
214
|
+
]
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
### Quan Trọng (2)
|
|
222
|
+
|
|
223
|
+
**4. Android Chưa Check Đăng Ký Vân Tay**
|
|
224
|
+
- Có thể crash nếu user chưa đăng ký vân tay
|
|
225
|
+
|
|
226
|
+
**5. Nút Chưa Có Debouncing**
|
|
227
|
+
- Tap nhiều lần → Nhiều prompts
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
### Nhỏ (1)
|
|
232
|
+
|
|
233
|
+
**6. Thiếu Loading State**
|
|
234
|
+
- Màn hình trắng 1-2 giây khi check availability
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## ✅ Checklist Trước Khi Deploy
|
|
239
|
+
|
|
240
|
+
### Code (NGHIÊM TRỌNG)
|
|
241
|
+
- [ ] Sửa iOS permission (30 phút) ⚠️⚠️⚠️
|
|
242
|
+
- [ ] Thêm token migration (45 phút) ⚠️⚠️⚠️
|
|
243
|
+
- [ ] Thêm fallback UI (20 phút) ⚠️⚠️⚠️
|
|
244
|
+
- [ ] Sửa Android enrollment check (15 phút)
|
|
245
|
+
- [ ] Thêm debouncing (10 phút)
|
|
246
|
+
|
|
247
|
+
### Test
|
|
248
|
+
- [ ] Test trên iPhone (iOS 15+)
|
|
249
|
+
- [ ] Test trên Android (Android 10+)
|
|
250
|
+
- [ ] Test với mạng yếu
|
|
251
|
+
- [ ] Test offline
|
|
252
|
+
- [ ] Test permission flows
|
|
253
|
+
- [ ] Test ảnh lớn (> 5MB)
|
|
254
|
+
|
|
255
|
+
### Regression
|
|
256
|
+
- [ ] Password login vẫn hoạt động
|
|
257
|
+
- [ ] Logout hoạt động
|
|
258
|
+
- [ ] Session persistence hoạt động
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
## 📊 Thống Kê
|
|
263
|
+
|
|
264
|
+
- Files: 5 thay đổi
|
|
265
|
+
- Rủi ro: CAO ⚠️⚠️⚠️
|
|
266
|
+
- Vấn đề: 6 (3 nghiêm trọng)
|
|
267
|
+
- Tests cần: 8 scenarios
|
|
268
|
+
- Thời gian sửa: ~2 giờ
|
|
269
|
+
- Thời gian test: ~45 phút
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## 🚀 Bước Tiếp Theo
|
|
274
|
+
|
|
275
|
+
1. ✅ Đọc báo cáo đầy đủ
|
|
276
|
+
2. ⚠️ Sửa 3 vấn đề nghiêm trọng (~2 giờ)
|
|
277
|
+
3. ✅ Chạy tests (~45 phút)
|
|
278
|
+
4. ✅ Test trên thiết bị thật
|
|
279
|
+
5. ✅ Tạo PR với báo cáo này đính kèm
|
|
280
|
+
|
|
281
|
+
**Ước tính production-ready**: 3-4 giờ
|
|
282
|
+
|
|
283
|
+
---
|
|
284
|
+
|
|
285
|
+
**💡 Lưu ý**: Đây là thay đổi HIGH RISK. Cần test kỹ trước khi deploy!
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
---
|
|
289
|
+
|
|
290
|
+
## Key Changes
|
|
291
|
+
|
|
292
|
+
### 1. Ngôn Ngữ
|
|
293
|
+
- ✅ Toàn bộ tiếng Việt
|
|
294
|
+
- ✅ Thuật ngữ tech giữ nguyên (Face ID, Touch ID, etc.)
|
|
295
|
+
- ✅ Dễ hiểu cho developer Việt Nam
|
|
296
|
+
|
|
297
|
+
### 2. Structure
|
|
298
|
+
- ✅ **Tính năng trước** (🎯 Tính Năng Bị Ảnh Hưởng)
|
|
299
|
+
- ✅ **Scenarios người dùng** (🎬 Scenarios Người Dùng)
|
|
300
|
+
- ✅ **Vấn đề cần sửa** (⚠️ Vấn Đề Cần Sửa)
|
|
301
|
+
- ✅ **Chi tiết kỹ thuật sau** (📝 Files Đã Sửa)
|
|
302
|
+
|
|
303
|
+
### 3. Focus
|
|
304
|
+
- ✅ Tính năng và tác động lên user
|
|
305
|
+
- ✅ Hành động cụ thể cần làm
|
|
306
|
+
- ✅ Ước tính thời gian
|
|
307
|
+
- ✅ Priority rõ ràng
|
|
308
|
+
|
|
309
|
+
### 4. Tone
|
|
310
|
+
- ✅ Thân thiện, dễ hiểu
|
|
311
|
+
- ✅ Actionable (có thể hành động ngay)
|
|
312
|
+
- ✅ Emoji để dễ scan
|
|
313
|
+
- ✅ Checklist để track progress
|