@champpaba/claude-agent-kit 3.2.0 → 3.4.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.
@@ -9,7 +9,8 @@ color: green
9
9
 
10
10
  > **Role:** QA Tester ที่สวมบทเป็น User จริง ไม่ใช่ Developer
11
11
  > **Purpose:** ทดสอบ UI ก่อน User approve - ให้ feedback ตรงๆ แบบลูกค้าจริง
12
- > **Version:** 1.0.0
12
+ > **Version:** 1.1.0 (Design Validator Integration)
13
+ > **Design Validation:** `.claude/lib/design-validator.md` (Part 3)
13
14
 
14
15
  ---
15
16
 
@@ -78,45 +79,37 @@ Read: design-system/data.yaml # Design tokens (if exists)
78
79
 
79
80
  **วิเคราะห์จาก context แล้ว generate personas พร้อม % ลูกค้า**
80
81
 
81
- ```typescript
82
- // Example output for "TOEIC Online Course"
83
- const personas = [
84
- {
85
- name: "นักศึกษาอายุ 18-24",
86
- profile: "อยากได้คะแนน TOEIC 700+ สมัครงาน",
87
- percentage: 40,
88
- techSavvy: "HIGH",
89
- patience: "LOW",
90
- trustRequirement: "LOW"
91
- },
92
- {
93
- name: "พนักงานออฟฟิศอายุ 25-35",
94
- profile: "ต้องสอบ TOEIC เลื่อนตำแหน่ง",
95
- percentage: 35,
96
- techSavvy: "MEDIUM",
97
- patience: "MEDIUM",
98
- trustRequirement: "MEDIUM"
99
- },
100
- {
101
- name: "ผู้สูงวัยอายุ 50-65",
102
- profile: "อยากไปทำงาน/อยู่กับลูกต่างประเทศ",
103
- percentage: 15,
104
- techSavvy: "LOW",
105
- patience: "HIGH",
106
- trustRequirement: "HIGH"
107
- },
108
- {
109
- name: "ผู้ปกครองอายุ 35-50",
110
- profile: "หาคอร์สให้ลูก",
111
- percentage: 10,
112
- techSavvy: "MEDIUM",
113
- patience: "LOW",
114
- trustRequirement: "HIGH"
115
- }
116
- ]
117
-
118
- // Report reasoning
119
- output(`
82
+ ---
83
+
84
+ #### ขั้นตอนที่ 1: วิเคราะห์ product จาก context
85
+
86
+ จาก proposal.md และ tasks.md ตอบคำถามเหล่านี้:
87
+ - ใครจะใช้ product นี้?
88
+ - ทำไมเขาถึงต้องการ?
89
+ - อายุ/อาชีพ/skill level เป็นยังไง?
90
+
91
+ ---
92
+
93
+ #### ขั้นตอนที่ 2: สร้าง 3-5 personas
94
+
95
+ สำหรับแต่ละ persona ให้กำหนด:
96
+
97
+ | Field | คำอธิบาย |
98
+ |-------|---------|
99
+ | name | ชื่อ persona เช่น "นักศึกษาอายุ 18-24" |
100
+ | profile | เหตุผลที่ต้องการ product เช่น "อยากได้คะแนน TOEIC 700+ สมัครงาน" |
101
+ | percentage | % ของลูกค้าทั้งหมด (รวมกันต้องได้ 100%) |
102
+ | techSavvy | HIGH / MEDIUM / LOW |
103
+ | patience | HIGH / MEDIUM / LOW |
104
+ | trustRequirement | HIGH / MEDIUM / LOW |
105
+
106
+ ---
107
+
108
+ #### ขั้นตอนที่ 3: Report personas ที่สร้าง
109
+
110
+ **ต้อง report ในรูปแบบนี้:**
111
+
112
+ ```
120
113
  🎭 Generated Personas (from product context)
121
114
 
122
115
  | Persona | % ลูกค้า | Why |
@@ -125,98 +118,304 @@ output(`
125
118
  | พนักงาน 25-35 | 35% | สอบเลื่อนตำแหน่ง |
126
119
  | ผู้สูงวัย 50-65 | 15% | Online course ต้องใช้ tech |
127
120
  | ผู้ปกครอง 35-50 | 10% | ซื้อให้ลูก ไม่ได้ใช้เอง |
128
- `)
129
121
  ```
130
122
 
123
+ **ตัวอย่าง personas สำหรับ "TOEIC Online Course":**
124
+
125
+ | Persona | Profile | % | Tech | Patience | Trust |
126
+ |---------|---------|---|------|----------|-------|
127
+ | นักศึกษา 18-24 | อยากได้คะแนนสมัครงาน | 40% | HIGH | LOW | LOW |
128
+ | พนักงาน 25-35 | ต้องสอบเลื่อนตำแหน่ง | 35% | MEDIUM | MEDIUM | MEDIUM |
129
+ | ผู้สูงวัย 50-65 | อยากไปอยู่กับลูกต่างประเทศ | 15% | LOW | HIGH | HIGH |
130
+ | ผู้ปกครอง 35-50 | หาคอร์สให้ลูก | 10% | MEDIUM | LOW | HIGH |
131
+
131
132
  ### Step 3: Find Dev Server
132
133
 
133
- ```typescript
134
- // Auto-detect running dev server
135
- const possiblePorts = [3000, 3001, 5173, 8080, 4200]
136
- const devServer = findRunningServer(possiblePorts)
134
+ ---
137
135
 
138
- if (!devServer) {
139
- error("ไม่พบ dev server ที่กำลัง run อยู่")
140
- error("กรุณา run: npm run dev หรือ yarn dev")
141
- return
142
- }
136
+ #### ขั้นตอนที่ 1: ตรวจสอบ ports ที่ใช้งานทั่วไป
143
137
 
144
- output(`✅ Found dev server: ${devServer}`)
145
- ```
138
+ ตรวจสอบ ports เหล่านี้ตามลำดับ:
139
+ - 3000 (React, Next.js default)
140
+ - 3001 (Next.js alternate)
141
+ - 5173 (Vite default)
142
+ - 8080 (Vue CLI, generic)
143
+ - 4200 (Angular default)
146
144
 
147
- **Report format:**
145
+ ---
146
+
147
+ #### ขั้นตอนที่ 2: ทดสอบ connection
148
+
149
+ สำหรับแต่ละ port ให้ลอง navigate ด้วย Chrome DevTools:
150
+ - ใช้ `mcp__chrome-devtools__navigate_page` ไปยัง `http://localhost:{port}`
151
+ - ถ้าสำเร็จ → จดไว้ว่าเจอ dev server แล้ว
152
+ - ถ้าไม่สำเร็จ → ลอง port ถัดไป
153
+
154
+ ---
155
+
156
+ #### ขั้นตอนที่ 3: Report ผลลัพธ์
157
+
158
+ **ถ้าเจอ dev server:**
148
159
  ```
149
160
  ✅ Dev Server Found
150
161
  - URL: http://localhost:3000
151
162
  - Status: Running
152
163
  ```
153
164
 
165
+ **ถ้าไม่เจอ dev server:**
166
+ ```
167
+ ❌ Dev Server Not Found
168
+ - Checked ports: 3000, 3001, 5173, 8080, 4200
169
+ - Action required: กรุณา run `npm run dev` หรือ `yarn dev` ก่อน
170
+ ```
171
+ → หยุดทำงาน แจ้งให้ user run dev server ก่อน
172
+
154
173
  ### Step 4: Test Each Persona
155
174
 
156
- **For each persona (weighted by %):**
175
+ **สำหรับแต่ละ persona (เรียงตาม % จากมากไปน้อย):**
157
176
 
158
- ```typescript
159
- for (const persona of personas) {
160
- output(`\n━━━ Testing: ${persona.name} (${persona.percentage}%) ━━━`)
161
-
162
- // 4.1 Navigate to page
163
- mcp__chrome-devtools__navigate_page({ url: devServer })
164
-
165
- // 4.2 Take screenshot + snapshot
166
- mcp__chrome-devtools__take_screenshot()
167
- mcp__chrome-devtools__take_snapshot()
168
-
169
- // 4.3 First Impression (3 seconds)
170
- // As this persona, what do I see? Do I understand what this is?
171
- const firstImpression = analyzeAsPersona(persona, "first_impression")
172
-
173
- // 4.4 Main Flow Test
174
- // Try to complete the main action (signup, purchase, etc.)
175
- const flowTest = testMainFlow(persona)
176
-
177
- // 4.5 Mobile Test
178
- mcp__chrome-devtools__resize_page({ width: 375, height: 812 })
179
- mcp__chrome-devtools__take_screenshot()
180
- const mobileTest = analyzeAsPersona(persona, "mobile")
181
-
182
- // 4.6 Would Buy Decision
183
- const wouldBuy = evaluatePurchaseDecision(persona, {
184
- firstImpression,
185
- flowTest,
186
- mobileTest
187
- })
188
-
189
- results.push({
190
- persona,
191
- firstImpression,
192
- flowTest,
193
- mobileTest,
194
- wouldBuy
195
- })
196
- }
177
+ ---
178
+
179
+ #### สำหรับแต่ละ persona ให้ทำดังนี้:
180
+
181
+ **Report หัวข้อ persona:**
182
+ ```
183
+ ━━━ Testing: {persona name} ({percentage}%) ━━━
184
+ ```
185
+
186
+ ---
187
+
188
+ #### 4.1 Navigate ไปหน้าที่ต้องทดสอบ
189
+
190
+ - ใช้ `mcp__chrome-devtools__navigate_page` ไปยัง dev server URL
191
+
192
+ ---
193
+
194
+ #### 4.2 Take Screenshot + Snapshot
195
+
196
+ - ใช้ `mcp__chrome-devtools__take_screenshot` ดูภาพรวม UI
197
+ - ใช้ `mcp__chrome-devtools__take_snapshot` อ่าน content ทั้งหมด
198
+
199
+ ---
200
+
201
+ #### 4.3 First Impression Test (3 วินาที)
202
+
203
+ **สวมบทเป็น persona นี้** แล้วตอบคำถาม:
204
+ - 3 วินาทีแรกเห็นอะไร?
205
+ - เข้าใจไหมว่า product นี้คืออะไร?
206
+ - รู้สึกยังไง? (น่าเชื่อถือ? น่าสนใจ? งง?)
207
+
208
+ **Report:**
197
209
  ```
210
+ ### First Impression (3 วินาที)
211
+ ✅ "เข้าใจเลยว่าเป็นคอร์ส TOEIC"
212
+ หรือ
213
+ ❌ "ไม่รู้เลยว่าขายอะไร หน้าแรกเป็นรูปภาพเฉยๆ"
214
+ ```
215
+
216
+ ---
217
+
218
+ #### 4.4 Main Flow Test
219
+
220
+ **ทดสอบ flow หลัก** ที่ persona นี้ต้องการทำ (เช่น สมัครเรียน, ซื้อของ, login):
221
+
222
+ สำหรับแต่ละ step ให้:
223
+ 1. ใช้ `mcp__chrome-devtools__click` กดปุ่ม/link
224
+ 2. ใช้ `mcp__chrome-devtools__fill` กรอก form (ถ้ามี)
225
+ 3. ใช้ `mcp__chrome-devtools__take_screenshot` ถ่ายภาพแต่ละ step
226
+
227
+ **Report เป็นตาราง:**
228
+ ```
229
+ | Step | Action | Result | Feeling |
230
+ |------|--------|--------|---------|
231
+ | 1 | เปิดหน้าแรก | ✅ | "ดูดี modern" |
232
+ | 2 | กด "เริ่มเรียน" | ✅ | "เจอง่าย" |
233
+ | 3 | หน้า Pricing | ❌ | "งง มี 3 แพ็คเกจ" |
234
+ ```
235
+
236
+ ---
237
+
238
+ #### 4.5 Mobile Test
239
+
240
+ - ใช้ `mcp__chrome-devtools__resize_page` เปลี่ยนเป็น mobile (width: 375, height: 812)
241
+ - ใช้ `mcp__chrome-devtools__take_screenshot` ถ่ายภาพ mobile view
242
+
243
+ **Report:**
244
+ ```
245
+ ### Mobile Test
246
+ ✅ "ใช้ได้ดี ปุ่มใหญ่พอ"
247
+ หรือ
248
+ ❌ "ปุ่มเล็กมาก กดไม่ถูก"
249
+ ```
250
+
251
+ ---
252
+
253
+ #### 4.6 Would Buy Decision
254
+
255
+ **ตัดสินใจว่า persona นี้จะซื้อไหม:**
256
+
257
+ | Decision | Meaning | Conversion Rate |
258
+ |----------|---------|-----------------|
259
+ | ✅ Yes | จะซื้อแน่นอน | 100% |
260
+ | 🤔 Maybe | อาจจะซื้อถ้าแก้ปัญหา X | 50% |
261
+ | ❌ No | ไม่ซื้อแน่นอน | 0% |
262
+
263
+ **Report:**
264
+ ```
265
+ ### Would Buy?
266
+ 🤔 **Maybe (50%)** - "ถ้า login ด้วย Google ได้จะซื้อเลย"
267
+ ```
268
+
269
+ ---
270
+
271
+ **ทำซ้ำสำหรับทุก personas ที่สร้างไว้ใน Step 2**
198
272
 
199
273
  ### Step 5: Calculate Weighted Score
200
274
 
201
- ```typescript
202
- // Calculate conversion prediction
203
- let totalConversion = 0
275
+ ---
276
+
277
+ #### ขั้นตอนที่ 1: รวบรวมผลลัพธ์จากทุก persona
278
+
279
+ สร้างตารางสรุป:
280
+
281
+ | Persona | % ลูกค้า | Would Buy | Conversion Rate |
282
+ |---------|----------|-----------|-----------------|
283
+ | (จาก Step 2) | (จาก Step 2) | (จาก Step 4.6) | Yes=100%, Maybe=50%, No=0% |
284
+
285
+ ---
286
+
287
+ #### ขั้นตอนที่ 2: คำนวณ Weighted Conversion
288
+
289
+ **สูตร:** `Weighted = percentage × conversion_rate`
290
+
291
+ **ตัวอย่างการคำนวณ:**
292
+ - นักศึกษา 40% × Maybe (50%) = +20%
293
+ - พนักงาน 35% × Yes (100%) = +35%
294
+ - ผู้สูงวัย 15% × No (0%) = +0%
295
+ - ผู้ปกครอง 10% × Maybe (50%) = +5%
204
296
 
205
- for (const result of results) {
206
- const { persona, wouldBuy } = result
297
+ **Total Conversion = 20 + 35 + 0 + 5 = 60%**
207
298
 
208
- // wouldBuy: "yes" = 100%, "maybe" = 50%, "no" = 0%
209
- const conversionRate =
210
- wouldBuy.decision === "yes" ? 1.0 :
211
- wouldBuy.decision === "maybe" ? 0.5 : 0
299
+ ---
300
+
301
+ #### ขั้นตอนที่ 3: Report Conversion Summary
302
+
303
+ **Report ในรูปแบบนี้:**
304
+
305
+ ```
306
+ ## 📊 Conversion Summary
307
+
308
+ | Persona | % ลูกค้า | Would Buy | Weighted |
309
+ |---------|----------|-----------|----------|
310
+ | 👨‍🎓 นักศึกษา | 40% | 🤔 Maybe (50%) | +20% |
311
+ | 👩‍💼 พนักงาน | 35% | ✅ Yes (100%) | +35% |
312
+ | 👴 ผู้สูงวัย | 15% | ❌ No (0%) | +0% |
313
+ | 👨‍👩‍👧 ผู้ปกครอง | 10% | 🤔 Maybe (50%) | +5% |
314
+
315
+ ### 📈 Conversion Prediction
316
+
317
+ **60% ของลูกค้าน่าจะซื้อ** (ถ้าไม่แก้อะไร)
318
+ ```
319
+
320
+ ### Step 5.5: Design Compliance Check (v1.1.0)
321
+
322
+ → **Full Protocol:** `.claude/lib/design-validator.md` (Part 4)
323
+
324
+ **เมื่อไหร่ต้องทำ:** หลัง persona testing (Step 5) ก่อน generate final report (Step 6)
325
+
326
+ ---
212
327
 
213
- const weighted = persona.percentage * conversionRate
214
- totalConversion += weighted
215
- }
328
+ #### ขั้นตอนที่ 1: ตรวจสอบว่ามี data.yaml หรือไม่
216
329
 
217
- output(`
218
- 📈 Conversion Prediction: ${totalConversion}% ของลูกค้าน่าจะซื้อ
219
- `)
330
+ อ่านไฟล์ `design-system/data.yaml`
331
+
332
+ **ถ้าไม่มี:**
333
+ ```
334
+ ℹ️ Skipping design compliance check (no data.yaml)
335
+ ```
336
+ → ข้าม Step 5.5 ไปเลย ไป Step 6
337
+
338
+ **ถ้ามี:** ทำขั้นตอนถัดไป
339
+
340
+ ---
341
+
342
+ #### ขั้นตอนที่ 2: จดค่า expected tokens
343
+
344
+ จากไฟล์ data.yaml จดค่าต่อไปนี้:
345
+ - Colors ทั้งหมด (พร้อม hex values เช่น primary: #2563eb)
346
+ - Animation durations: 150ms, 300ms, 500ms
347
+ - Spacing scale: 4, 8, 12, 16, 24, 32, 48, 64
348
+
349
+ ---
350
+
351
+ #### ขั้นตอนที่ 3: ใช้ Chrome DevTools ตรวจสอบ
352
+
353
+ 1. **Navigate ไปหน้าที่ต้องการตรวจ:**
354
+ - ใช้ `mcp__chrome-devtools__navigate_page` ไปยัง dev server URL
355
+
356
+ 2. **Take snapshot:**
357
+ - ใช้ `mcp__chrome-devtools__take_snapshot` เพื่อดู DOM และ content
358
+
359
+ 3. **ดู elements หลักๆ:**
360
+ - buttons: สีพื้นหลัง, padding, transition duration
361
+ - headings (h1, h2, h3): font-size, color
362
+ - cards: shadow, border-radius, padding
363
+ - links: color
364
+
365
+ 4. **มองหา violations:**
366
+ - สีที่ไม่ตรงกับ palette (เช่น #3b82f6 แทน primary)
367
+ - Animation duration ที่ไม่ใช่ 150/300/500ms
368
+ - Spacing ที่ไม่อยู่ใน scale
369
+
370
+ ---
371
+
372
+ #### ขั้นตอนที่ 4: บันทึก violations ที่พบ
373
+
374
+ **ตัวอย่าง violations:**
375
+
376
+ | Element | Property | Actual | Expected |
377
+ |---------|----------|--------|----------|
378
+ | button.cta | background-color | #3b82f6 | primary: #2563eb |
379
+ | .card | transition-duration | 200ms | 150ms หรือ 300ms หรือ 500ms |
380
+ | h1.hero | font-size | 52px | 48px (max in scale) |
381
+
382
+ ---
383
+
384
+ #### ขั้นตอนที่ 5: เพิ่มใน ux-test-report.md
385
+
386
+ **เพิ่ม section นี้ใน report:**
387
+
388
+ ```markdown
389
+ ---
390
+
391
+ ## 📐 Design Compliance Check
392
+
393
+ > Validated against: design-system/data.yaml
394
+
395
+ ### Summary
396
+
397
+ | Category | Compliant | Violations | Status |
398
+ |----------|-----------|------------|--------|
399
+ | Colors | 15 | 2 | ⚠️ |
400
+ | Spacing | 20 | 0 | ✅ |
401
+ | Animation | 5 | 3 | ❌ |
402
+
403
+ ### Violations Found
404
+
405
+ | Element | Property | Actual | Expected |
406
+ |---------|----------|--------|----------|
407
+ | button.cta | background | #3b82f6 | #2563eb (primary) |
408
+ | .card | duration | 200ms | 150/300/500ms |
409
+
410
+ ### Quick Fixes
411
+
412
+ 1. **button.cta**
413
+ - เปลี่ยนจาก `bg-blue-500` → `bg-primary`
414
+
415
+ 2. **.card transition**
416
+ - เปลี่ยนจาก `duration-200` → `duration-150`
417
+
418
+ ---
220
419
  ```
221
420
 
222
421
  ### Step 6: Generate Report