@haposoft/cafekit 0.3.1 → 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/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Spec-Driven Development workflow for AI coding assistants
4
4
 
5
- [![Version](https://img.shields.io/badge/version-0.3.0-blue.svg)](https://github.com/haposoft/cafekit)
5
+ [![Version](https://img.shields.io/badge/version-0.3.1-blue.svg)](https://github.com/haposoft/cafekit)
6
6
  [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
7
7
  [![Claude Code](https://img.shields.io/badge/Claude%20Code-Supported-orange.svg)](https://claude.ai/code)
8
8
  [![Antigravity](https://img.shields.io/badge/Antigravity-Supported-purple.svg)](https://github.com/google/antigravity)
@@ -793,7 +793,7 @@ Task #4: Add protected route middleware
793
793
 
794
794
  ## Changelog
795
795
 
796
- ### [0.3.0] - 2026-03-13
796
+ ### [0.3.1] - 2026-03-13
797
797
 
798
798
  #### Changed
799
799
  - **Renamed package** from `@haposoft/cafekit-spec` to `@haposoft/cafekit`
@@ -866,7 +866,7 @@ MIT License - See [LICENSE](LICENSE) for details
866
866
 
867
867
  ---
868
868
 
869
- **Made with care by the CafeKit Team**
869
+ **Made with care by the Haposoft Team**
870
870
 
871
871
  <p align="center">
872
872
  <sub>Multi-platform Workflow for AI Coding Assistants</sub>
package/bin/install.js CHANGED
@@ -368,6 +368,7 @@ function getPlatformSpecFiles(platformKey) {
368
368
  'spec-validate.md',
369
369
  'spec-tasks.md',
370
370
  'spec-status.md',
371
+ 'impact-analysis.md',
371
372
  'docs-init.md',
372
373
  'docs-update.md'
373
374
  ];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haposoft/cafekit",
3
- "version": "0.3.1",
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